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.