On May 27, 2009, at 11:18 AM, Derick Eddington wrote:
(define-curried (f3 x1 x2 x3) "third-order")
(((f3 1) 2) 3) ;; 3 parens here
"third-order"
(define-curried (f2 x1 x2) "second-order")
((f2 1) 2) ;; 2 parens here
"second-order"
(define-curried (f1 x1) "first-order")
(f1 1) ;; 1 parens here
"first-order"
(define-curried (f0) "zero-order")
f0 ;; 0 parens here
"zero-order"
Oh. Interesting perspective.
My first inclination was to define curry as:
(define-syntax curry
(syntax-rules ()
[(_ proc) proc] ;;; different base case
[(_ proc x x* ...)
(lambda (x)
(curry (lambda (x* ...) (proc x x* ...)) x* ...))]))
instead of what I posted:
(define-syntax curry
(syntax-rules ()
[(_ proc x) (lambda (x) (proc x))]
[(_ proc x x* ...)
(lambda (x)
(curry (lambda (x* ...) (proc x x* ...)) x* ...))]))
but this yields the wrong expansion. The correct recursive
definition with 0 params would have to be:
(define-syntax curry
(syntax-rules ()
[(_ proc) (proc)] ;;; e.g., (curry +) == 0
[(_ proc x x* ...)
(lambda (x)
(curry (lambda (x* ...) (proc x x* ...)) x* ...))]))
and with define-curried being:
(define-syntax define-curried
(syntax-rules ()
[(_ (name args ...) b b* ...)
(define name
(curry (lambda (args ...) b b* ...) args ...))]))
we get:
> (define-curried (f3 x1 x2 x3) "third-order")
> (((f3 1) 2) 3)
"third-order"
> (define-curried (f2 x1 x2) "second-order")
> ((f2 1) 2)
"second-order"
> (define-curried (f1 x1) "first-order")
> (f1 1)
"first-order"
> (define-curried (f0) "zero-order")
> f0
"zero-order"
It's bizarre, but it has to be true! :-)
Aziz,,,