Let's consider an example where we wish to construct a linear function of
x called
f, with the slope and yintercept of the graph being optional arguments of
f. We use the
>> operator to attach the default values to our function, coded in a special way.
i1 : opts = {Slope => 1, Intercept => 1}
o1 = {Slope => 1, Intercept => 1}
o1 : List

i2 : f = opts >> o > x > x * o.Slope + o.Intercept
o2 = f
o2 : FunctionClosure

i3 : f 5
o3 = 6

i4 : f(5, Slope => 100)
o4 = 501

i5 : f(5, Slope => 100, Intercept => 1000)
o5 = 1500

In the example the function body is the code
x * opts.Slope + opts.Intercept. When it is evaluated, a hash table is assigned to
opts; its keys are the names of the optional arguments, and the values are the corresponding current values, obtained either from the default values specified in the definition of
f, or from the options specified at the time
f is called.
In the example above, the inner function has just one argument, x, but handling multiple arguments is just as easy. Here is an example with two arguments.
i6 : f = {a => 1000} >> o > (x,y) > x * o.a + y;

i7 : f(3,7)
o7 = 3007

i8 : f(5,11,a=>10^20)
o8 = 500000000000000000011
