如何在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)
。