This site is a static rendering of the Trac instance that was used by R7RS-WG1 for its work on R7RS-small (PDF), which was ratified in 2013. For more information, see Home.
Source for wiki BeyondCurryingHemann version 3
author
cowan
comment
ipnr
127.11.51.1
name
BeyondCurryingHemann
readonly
0
text
[http://webyrd.net/scheme-2013/papers/HemannCurrying2013.pdf λ* : Beyond Currying]
Notes:
The proposed name is `lambda*`, not `λ*`.
The proposal is Variant 5, which has no support for zero-argument or zero-or-more-arguments procedures, with the additional feature of Variant 8, supporting multi-expression bodies. Section 4 says "nullary `λ∗` functions seem to be of little to no use", and I agree: they seem to be provided only so that `lambda*` can fully subsume `lambda`, which I think is a mistake (it makes detecting an error in the number of arguments at compile time impossible).
Here is the (not yet debugged) source code:
{{{
(import (scheme case-lambda))
(define-syntax lambda*
(syntax-rules ()
((_ a* e* ...)
(lambda*-h a* (let () e* ...)))))
(define-syntax lambda*-h
(syntax-rules ()
((_ (a a* ...) e) (posary-h (a a* ...) e))
((_ (a a* ... . rest) e)
(polyvariadic-h (a a* ... . rest) e))))
(define-syntax posary-h
(syntax-rules ()
((_ (a a* ...) e)
(letrec
((rec
(case-lambda
(() rec)
((a a* ...) e)
((a a* ... . rest)
(apply (rec a a* ...) rest))
(some ((lambda more (apply rec (append some more))))))))
rec))))
(define-syntax polyvariadic-h
(syntax-rules ()
((_ (a a* ... . rest) e)
(letrec
((rec
(case-lambda
(() rec)
((a a* ... . rest) e)
(some ((lambda more (apply rec (append some more))))))))
rec))))
}}}
time
2017-07-02 06:42:35
version
3