Functions

A function in sclang is an expression which defines operations to be performed when it is sent the value message. It has no name or identifier attached to it, which is known as lambda expression or anonymous function in other programming languages. Function definitions in sclang are enclosed in curly brackets {}, f.e.:

{ 3 + 4 }


Functions are not evaluated immediately when they occur in code, but their definitions are passed as values just like integers or strings.

f = { 3 + 4 };  // Let f be this function - no evaluation yet.
f.value;        // Perform the operation, see Post window for output.


Arguments

Argument declarations, if any, follow the open bracket.

f = { arg a, b;  a*a + b}  // Let f be a function that takes two arguments
f.value(2, 3)              // Pass the arguments in order and evaluate it
f.value(b: 3, a: 2)        // Arguments can be passed by name, in any order
f.value(2)                 // Oops, second argument is nil.


Default values for the arguments can be provided in the following form:

{ arg a = 1, b = 2;  a*a + b}


Controlling arguments

Arguments in sclang are more than they seem to be. You have control over the arguments outside the function. This is very useful in the context of sound production.

f = { arg f = 440, m = 0.1; SinOsc.ar(freq: f, mul: m)!2 }
p = f.play;

// Change the value of the arguments while the Synth is playing
p.set(\f, 350);
p.set(\m, 0.3);



First class citizens

Functions are themselves ─ so called ─ first class citizens in the language and can are treated like other simple types. For example, you can return a function from a function.

~makeF = { arg v; { arg a; v*a } }
t = ~makeF.value(3)
t.value(2)


They can also be passed as arguments. For example, arrays provide the method collect that expects a function as argument.

[0, 1, 2, 3, 4].collect({ arg i; i*i + 1 })


To be continued.

• Scope
• Variables
• Syntax variations
• Methods