gpt4 book ai didi

clojure - 是否有可能对 Lisp 家族语言实现自动柯里化(Currying)?

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

也就是说,当您调用一个元数大于 1 且只有一个参数的函数时,它应该柯里化(Currying)该参数并返回元数减少的结果函数,而不是显示错误。使用 Lisp 的宏可以做到这一点吗?

最佳答案

这是可能的,但如果您想要一个有用的结果并不容易。

  • 如果您想要一种始终执行简单柯里化(Currying)的语言,那么实现起来很容易。您只需将多个输入的每个应用程序转换为嵌套应用程序,对于多个参数的函数也是如此。用Racket's语言设施,这是一个很简单的练习。 (在其他 lisp 中,您可以通过围绕要使用它的代码的一些宏来获得类似的效果。)

    (顺便说一句,我在 Racket 之上有一种语言可以做到这一点。它具有自动柯里化(Currying)语言的全部可爱之处,但它并不实用。)

    但是,它不是很有用,因为它只适用于一个参数的函数。您可以通过一些黑客攻击使其变得有用,例如,将围绕您的语言的 lisp 系统的其余部分视为外语并提供使用它的形式。另一种选择是为您的语言提供有关周围 lisp 函数的数量信息。这些都需要更多的工作。

  • 另一种选择是只检查每个应用程序。换句话说,你每转动一次

    (f x y z)

    进入检查 f 的元数的代码,如果没有足够的参数,将创建一个闭包。这本身并不太难,但会导致显着的间接费用。您可以尝试使用类似的技巧来了解您将在宏观级别使用的有关函数参数的一些信息,以了解应该在何处创建此类闭包——但这在本质上以相同的方式是困难的。

但是还有一个更严重的问题,在你想要做的事情的高层。问题是变元数函数不能很好地与自动柯里化(Currying)配合使用。例如,采用如下表达式:

(+ 1 2 3)

您如何决定是否应该按原样调用它,或者是否应该将其转换为 ((+ 1 2) 3)?似乎这里有一个简单的答案,但是这个呢? (翻译成你最喜欢的 lisp 方言)

(define foo (lambda xs (lambda ys (list xs ys))))

在这种情况下,您可以通过多种方式拆分 (foo 1 2 3)。另一个问题是您如何处理以下内容:

(list +)

这里你有 + 作为表达式,但你可以决定这与将它应用于适合 + 元数的零输入相同,但是接下来如何你写了一个计算加法函数的表达式? (旁注:ML 和 Haskell 通过不使用空函数来“解决”这个问题……)

其中一些问题可以通过决定每个“真实”应用程序都必须有括号来解决,因此永远不会应用 + 本身。但这失去了自动柯里化(Currying)语言的许多可爱之处,而且您仍然有问题需要解决...

关于clojure - 是否有可能对 Lisp 家族语言实现自动柯里化(Currying)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11218905/

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