10 Functions
| (require unstable/function) | 
This module provides tools for higher-order programming and creating functions.
10.1 Simple Functions
| (thunk body ...) | 
Examples:  | ||
  | ||
| > (f) | ||
1  | ||
| > (f 'x) | ||
1  | ||
| > (f #:y 'z) | ||
1  | 
10.2 Higher Order Predicates
This function is reprovided from scheme/function.
Examples:  | ||
  | ||
| > (f 1) | ||
#f  | ||
| > (f 'one) | ||
#t  | 
Examples:  | ||
  | ||
| > (f 1) | ||
#t  | ||
| > (f 1.0) | ||
#f  | ||
| > (f 1/2) | ||
#f  | ||
| > (f 0.5) | ||
#f  | 
Examples:  | ||
  | ||
| > (f 1) | ||
#t  | ||
| > (f 1.0) | ||
#t  | ||
| > (f 1/2) | ||
#t  | ||
| > (f 0.5) | ||
#f  | 
10.3 Currying and (Partial) Application
Examples:  | ||||
  | ||||
'(6 -4 21 1/2)  | ||||
  | ||||
  | ||||
  | ||||
  | ||||
| > (for-each call (list inc inc show reset show)) | ||||
  | 
  | |||
  | 
| ((papply f x ...) y ...) = (f x ... y ...) | 
| ((papplyr f x ...) y ...) = (f y ... x ...) | 
Examples:  | ||
  | ||
| > (reciprocal 3) | ||
1/3  | ||
| > (reciprocal 4) | ||
1/4  | ||
  | ||
| > (halve 3) | ||
3/2  | ||
| > (halve 4) | ||
2  | 
  | ||||
  | 
The curryn and currynr functions construct a curried version of f, specialized at x ..., that produces a result after n further applications. Arguments at any stage of application may include keyword arguments, so long as no keyword is duplicated. These curried functions obey the following equations:
| (curryn 0 f x ...) = (f x ...) | 
| ((curryn (+ n 1) f x ...) y ...) = (curryn n f x ... y ...) | 
| (currynr 0 f x ...) = (f x ...) | 
| ((currynr (+ n 1) f x ...) y ...) = (currynr n f y ... x ...) | 
The call, papply, and papplyr utilities are related to curryn and currynr in the following manner:
| (call f x ...) = (curryn 0 f x ...) = (currynr 0 f x ...) | 
| (papply f x ...) = (curryn 1 f x ...) | 
| (papplyr f x ...) = (currynr 1 f x ...) | 
Examples:  | ||
  | ||
| > (reciprocal 3) | ||
1/3  | ||
| > (reciprocal 4) | ||
1/4  | ||
  | ||
  | ||
| > (from-10 5) | ||
5  | ||
| > (from-10 10) | ||
0  | ||
  | ||
| > (from-0 5) | ||
-5  | ||
| > (from-0 10) | ||
-10  | ||
  | ||
| > (halve 3) | ||
3/2  | ||
| > (halve 4) | ||
2  | ||
  | ||
  | ||
| > (minus-10 5) | ||
-5  | ||
| > (minus-10 10) | ||
0  | ||
  | ||
| > (minus-0 5) | ||
5  | ||
| > (minus-0 10) | ||
10  | 
10.4 Eta Expansion
| (eta f) | 
This is useful for function expressions that may be run, but not called, before f is defined. The eta expression will produce a function without evaluating f.
Examples:  | ||
  | ||
| > f | ||
#<procedure:eta>  | ||
  | ||
| > (f 1) | ||
2  | 
| (eta* f x ...) | 
This macro behaves similarly to eta, but produces a function with statically known arity which may improve efficiency and error reporting.
Examples:  | ||
  | ||
| > f | ||
#<procedure:f>  | ||
| > (procedure-arity f) | ||
1  | ||
  | ||
| > (f 1) | ||
2  | 
10.5 Parameter Arguments
| (lambda/parameter (param-arg ...) body ...) | ||||||||||||||||||||||||||||||
  | 
Examples:  | |||||
  | |||||
  | |||||
| > (hello-world p) | |||||
| > (get-output-string p) | |||||
"Hello, World!\n"  |