class library: quit internal server on class library compilation
[supercollider.git] / HelpSource / Reference / Scope.schelp
blobafdff77da74602dc9d3eda833fac483c2bff3dff
1 title:: Scoping and Closure
2 summary:: scoping of variables
3 categories:: Language
5 SuperCollider has nested scoping of variables. A function can refer not only to its own arguments and variables, but also to those declared in any enclosing (defining) contexts.
7 For example, the function defined below within makeCounter can access all of the arguments and variables declared in code::makeCounter::.
8 Other code can call the returned function at some later time and it can access and update the values contained in code::makeCounter:: at the time when the inner function was instantiated.
9 code::
11 var makeCounter;
12 makeCounter = { arg curVal=0, stepVal=1;
13      // return a function :
14     {
15         var temp;
16         // temp is local to this function, curVal & stepVal in the
17         // enclosing function are referred to here within.
18         temp = curVal;
19         curVal = curVal + stepVal;
20         temp                       // return result
21     }
24 // Each invocation of makeCounter creates a new set of variables curVal and stepVal:
26 x = makeCounter.value(10, 1);
27 z = makeCounter.value(99, 100);
31 x and z are functions which refer to different instances of the variables curVal and stepVal
32 code::
33 x.value.postln; // posts 10
34 x.value.postln; // posts 11
35 z.value.postln; // posts 99
36 z.value.postln; // posts 199
37 x.value.postln; // posts 12
38 x.value.postln; // posts 13
39 z.value.postln; // posts 299
40 z.value.postln; // posts 399
43 Note that even though the function which defines curVal and stepVal has completed execution, its variables are still accessible to those functions that were defined within its context.
44 This is known as lexical closure, the capturing and availability of variables defined in outer contexts by inner contexts even when the outer contexts may have completed execution.