Local methods resemble bare methods but have names. They are declared within other methods, often as private utility routines. Local methods are typically used in a fashion similar to Pascal's local functions.
define method sum-squares(in :: <list>) => sum-of-element-squares :: <integer>; local method square( x ) x * x; end, method sum(list :: <list>) reduce1(\+, list); end; sum(map(square, in)); end;
Local methods can actually outlive the invocation of the function which created them. Parameters of the parent function remain bound in a local method, allowing some interesting techniques:
define method build-put(string :: <string>) => <function>; local method string-putter() puts(string); end; string-putter; // return local method end; define method print-hello() => (); let f = build-put("Hello!"); f(); // print "Hello1" end;
Local functions which contain bound variables in the above fashion are known as closures.