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 语句


yangrd
1.3k 声望225 粉丝

代码改变世界,知行合一。