at least, I think not. The set of abstractions available in computer languages today are sufficient to build frameworks for conveniently expressing computer music. Unfortunately, in practice, some pieces are missing in the implementations of languages available today. Often, the garbage collection is not performed in real time, and often argument passing is not very flexible. If lazy evaluation is not included, then implementing Patterns and Streams becomes more complicated." McCartney, James. "Rethinking the computer music language: SuperCollider." Computer Music Journal 26, no. 4 (2002): 61–68. https://doi.org/10.1162/014892602320991383
... State Storage Closure Storage Base Pointer State Position State for self 1 Ring Buffer for delay 1 State for self 2 Ring Buffer for delay 2 ... Program Function Prototype0 Static Variables ... ... Function Prototype1 OP A B C OP A B C OP A B C OP A B C OP A B C Upvalue List Program State Size Local(N1) Upvalue(N2) Open Closure Function Prototype State Storage Upvalues Open(Local(N1)) Open(Upvalue(N2)) State Position ` Escaped Closure Function Prototype State Storage Upvalues State Position Closed Upvalue 1 Closed Upvalue 2 Somewhere on the Heap Memory (Maybe Shared with other closures)
shift_state_position(1); ... update_ringbuffer(...); shift_state_position(-1); ... let ret_value = ... set_self(ret_value); ret_value } fn dsp(input){ let a = fbdelay(input,2000,0.9,0.5); shift_state_position(40004); let b = fbdelay(a, 3000,0.7,0.5); shift_state_position(40004); let c = fbdelay(b,5000,0.5,0.2); shift_state_position(-80008); c } self self self delay delay delay