【问题标题】:How to write a self currying lambda macro in scheme? [duplicate]如何在方案中编写一个自柯里化 lambda 宏? [复制]
【发布时间】:2021-01-19 18:11:24
【问题描述】:

我想写这样的函数:

(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))))))

我该怎么做?

【问题讨论】:

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

标签: scheme racket currying guile chicken-scheme


【解决方案1】:

这是我对你的宏的建议:

(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你可能需要实现。

【讨论】:

    猜你喜欢
    • 2016-06-20
    • 1970-01-01
    • 1970-01-01
    • 2017-01-20
    • 1970-01-01
    • 1970-01-01
    • 2017-02-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多