微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何在方案中编写一个自循环的lambda宏?

如何解决如何在方案中编写一个自循环的lambda宏?

我想编写如下函数

(define foo (\ (a b c) (+ a (+ b c))))

自动将其转换为:

(define foo (lambda (a) (lambda (b) (lambda (c) (+ a (+ b c))))))

并以此方式使用它(如果可能):

(map (foo 1 2) (interval 1 10))

就像我在写这篇文章一样:

(map ((foo 1) 2) (interval 1 10))

我不知道如何在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))))))

我该怎么做?

解决方法

这是我对您的宏的建议:

(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得到更多的参数,它将应用下一个。如果传递过多的参数,也会产生错误,因为否则会得到不清楚的“应用程序,而不是过程”

error,您可能需要实施。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。