gpt4 book ai didi

macros - 使用宏在 Scheme 中柯里化(Currying)函数

转载 作者:太空宇宙 更新时间:2023-11-03 18:40:19 24 4
gpt4 key购买 nike

我正在学习 Scheme 中的宏系统,我认为实现柯里化(Currying)函数是一个好的开始。这是我做的:

(define-syntax function
(syntax-rules ()
((_ () body ...) (lambda () body ...))
((_ (param) body ...) (lambda (param) body ...))
((_ (param_1 param_2 params ...) body ...) (lambda (param_1 . rest)
(let ((k (function (param_2 params ...) body ...)))
(if (null? rest) k (apply k rest)))))
((_ name params body ...) (define name (function params body ...)))))

此代码按预期工作。例如,我可以定义一个 add 函数,如下所示:

(function add (x y) (+ x y))

然后就可以正常调用了:

(add 2 3) ; => 5

此外,我可以轻松地部分应用它:

(map (add 10) '(2 3 5 7)) ; => (12 13 15 17)

现在我正在考虑允许柯里化(Currying)带有剩余参数的函数。所以我添加了一个新的语法规则:

((_ (param . params) body ...) (lambda (param . params) body ...))

不幸的是,当我尝试使用此规则创建函数时,出现错误:

(function add (x . y) (apply + `(,x ,@y)))

这是错误信息:

Error: invalid syntax in macro form: (x . y)

Call history:

<eval> (##sys#= len7 0)
<eval> (loop11 (##sys#cdr l6) (##sys#+ len7 -1))
<eval> (##sys#cdr l6)
<eval> (##sys#+ len7 -1)
<eval> (##sys#= len7 0)
<eval> (loop11 (##sys#cdr l6) (##sys#+ len7 -1))
<eval> (##sys#cdr l6)
<eval> (##sys#+ len7 -1)
<eval> (##sys#= len7 0)
<eval> (##sys#eq? l6 (quote ()))
<eval> (##sys#car tail15)
<eval> (##sys#cdr tail15)
<eval> (##sys#cons (rename14 (##core#syntax lambda)) (##sys#cons param body))
<eval> (rename14 (##core#syntax lambda))
<eval> (##sys#cons param body)
<syntax> (##core#lambda add (x . y) (apply + (quasiquote ((unquote x) (unquote-splicing y))))) <-

我做错了什么?

最佳答案

[评论正确;这个答案不是柯里化(Currying),而是部分评估。]

如你所知,你不需要使用 define-syntax 来支持柯里化(Currying)。通常不赞成在不需要时使用语法,因为 1) 语法引入了不同的求值规则,以及 2) 语法不能用作值。

这里有两种实现方式,一种用于(左) curry ,一种用于右 curry :

  (define (curry func . curry-args)
(lambda args
(apply func (append curry-args args))))

(define (rcurry func . curry-args)
(lambda args
(apply func (append args curry-args))))

以此为例:

> (define add-5 (curry + 5))
> (add-5 5)
10

关于macros - 使用宏在 Scheme 中柯里化(Currying)函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16066198/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com