Returning procedures
“Procedures returning procedures” is an important idiom of Motto.
Consider a simple procedure called complement that takes a predicate p and returns its inverse.
The following code snippet demonstrates how complement could be used:
> [2 remainder 0 eq] def is-even > 10 is-even #t > 3 is-even #f > @is-even complement def is-odd > 3 is-odd #t > 2 is-odd #f
Here we used complement to produce a new procedure which gives exactly the opposite result of is-even.
complement itself is defined as:
> [def p [p not]] def complement
Another example:
> [def vowel a e i o u list vowel swap list-contains] def is-vowel > @is-vowel complement def is-consonant > a is-vowel #t > b is-vowel #f > b is-consonant #t
Note: The value of a procedure can be extracted by preceding its name with an @. This is an alternative to
value procedure-name.
Reference: On Lisp.