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,,,

Reply via email to