Programs are stored in executable arrays and the curly brackets generate executable arrays. For example, if you input the line
{ add 2 mul }then the executable array object which represents the program ``take two elements from the stack, add them, and multiply two and put the result on the stack'' will be store on the top of the stack. You can bind the program to a name. That is,
/abc { add 2 mul } defbinds the executable array to the variable abc. The input
2 4 abc ::
outputs 12.
When sm1 encounters the name abc,
it looks up the user dictionary and finds that
the value of abc is the executable array
{ add 2 mul }
.
The executable array is loaded to the stack machine and
executed.
Funtions can be defined by using executable arrays. Here is a complete example of a function definition in sm1 following standard conventions.
/foo { /arg1 set [/n /i /ans] pushVariables [ /n arg1 def /ans 0 def 1 1 n { /i set /ans ans i add def } for ans /arg1 set ] pop popVariables arg1 } defThe function returns the sum
[/n /i /ans] pushVariablesThe macro pushVariables stores the previous values of n, i, ans on the stack and the macro popVariables restores the previous values. So, you can use n, i, ans as a local variable of this function. The function body should be enclosed as
[ ] popIt is also a convension in sm1 programming to avoid unmatched use of pushVariables and popVariables.
cv2.sm1 is a script to compute the multiplicites of
-modules.