如何在scheme中编写自转换lambda宏?

如何在scheme中编写自转换lambda宏?,scheme,racket,currying,guile,chicken-scheme,Scheme,Racket,Currying,Guile,Chicken Scheme,我想编写如下函数: (define-macro clambda ;curried lambda (lambda xs (if (< (length xs) 2) (if (eq? 1 (length xs)) (lambda () xs) (lambda (head xs) (tail xs))) (lambda (head xs) (clambda (tail xs)))))) (定义foo(\(a b c)(+a(+b c))

我想编写如下函数:

(define-macro clambda ;curried lambda
(lambda xs
 (if (< (length xs) 2)
     (if (eq? 1 (length xs))
         (lambda () xs)
         (lambda (head xs) (tail xs)))
     (lambda (head xs) (clambda (tail xs))))))
(定义foo(\(a b c)(+a(+b c)))

将其自动转换为以下内容:

(定义foo(lambda(a)(lambda(b)(lambda(c)(+a(+bc)щщ)))

并像这样使用(如果可能):

(地图(foo 12)(间隔110))

好像我在写这个:

(map((foo 1)2)(间隔110))

我不知道如何在scheme中编写宏,但我需要编写一个转换引用表达式的函数

(f arg1 arg2 argn)

像这样:

(define-macro clambda ;curried lambda
(lambda xs
 (if (< (length xs) 2)
     (if (eq? 1 (length xs))
         (lambda () xs)
         (lambda (head xs) (tail xs)))
     (lambda (head xs) (clambda (tail xs))))))
(定义宏clambda;当前lambda
(lambda xs)
(如果(<(长度xs)2)
(如果(等式1(长度xs))
(lambda()xs)
(兰博达(头X(尾X)))
(lambda(头x)(尾x()))

我如何才能做到这一点?

以下是我对您的宏的建议:

(define-syntax \ 
  (syntax-rules ()
    [(_ "build" (a) body)
     (lambda (a . rest)
       (if (null? rest)
           body
           (error "Too many arguments")))]
    [(_ "build" (a b ...) body)
     (lambda (a . rest)
       (define impl (\ "build" (b ...) body))
       (if (null? rest)
           impl
           (apply impl rest)))]
    [(_ (a b ...) body)
       (\ "build" (a b ...) body)]
    [(_ . rest) (error "Wong use of \\")]))

(define test (\ (a b c) (+ a b c)))
(define partial (test 4 5))
(partial 6) ; ==> 15
这确实会使生成的代码具有更大的开销,因为如果每个lambda获得更多参数,它将应用下一个lambda。如果传递的参数太多,也会产生错误,否则会得到不清楚的“应用程序,而不是过程”

错误
您可能需要执行。

通过
(f arg1 arg2 argn)
我的意思是
(f arg1 arg2 body)
(f(arg1 arg2)body)