curry.lisp
(define-macro curry (lambda (fn) ( (define curry0 (lambda (args body) ( (if (nil? args) (body) ( `(lambda ((,(car args))) (,( curry0 (cdr args) body ))) )) ))) (if (procedure? (apply fn)) ( (define args (car (cdr fn))) (define body (cdr (cdr fn))) (curry0 args body) ) (fn)))))
应用
(define add3 (curry(lambda (x y z) (+ x y z))))(((add3 1) 2) 3)
介绍
这条语句
(curry(lambda (x y z) (+ x y z)))
等价于上面这条语句
(lambda (x) (lambda (y) (lambda (z) ((+ x y z)))))
暂不反对这种写法
(define add30 (lambda (x y z) (+ x y z)))(define add3 (curry add30))
若想反对能够用宏重写 define 语句