gpt4 book ai didi

lambda - 如何在 Clojure 中将 lambda 实现为名为 "lambda"的函数?

转载 作者:行者123 更新时间:2023-12-03 14:43:55 25 4
gpt4 key购买 nike

我希望能够在 Clojure 中使用常见的 Lisp 语法定义 lambda。例如:

(lambda (myarg)
(some-functions-that-refer-to myarg))

这需要产生相同的结果:
#(some-functions-that-refer-to %)

就我而言,我知道我总是只有一个 arg,所以也许这可以简化事情。 (但它可以被称为任何东西——“myarg”或其他。)

我怀疑一个可行的解决方案是“(defmacro lambda ...”。如果是这样,我不确定最好的方法。如何干净地将arg名称转换为%?以及如何最终得到正确的功能?

或者,有没有比编写自己的宏更简单的解决方案来重新实现 Clojure 的... lambda?

最佳答案

#(foo %)只是 (fn [arg] (foo arg)) 的读者简写.没有理由编写扩展为 #(...) 的宏.所有%位于 #(...)无论如何,construct 都会立即扩展为 gensyms。

user> `#(foo % %1 %2)
(fn* [user/p1__1877 user/p2__1878]
(user/foo user/p1__1877 user/p1__1877 user/p2__1878))

如果你曾经写过一个扩展来构建匿名函数的宏,你不妨把它们扩展成 fn。形成自己。在您的情况下,您可能应该只使用 fn直接跳过宏。 fn是 Clojure 的 lambda .
(fn [] ...) 之间的区别和 (lambda () ...)在这种情况下,“fn”的类型比“lambda”短, fn其绑定(bind)采用向量,而 lambda拿一个 list 。如果您使用 Clojure,您最终将不得不习惯这一点,因为在所有 do 中,向量总是用于绑定(bind)集合。表格和 forbinding等等。据我了解,这背后的基本原理是列表用于函数调用或宏调用,而向量用于不调用的事物(例如,要绑定(bind)的符号列表)。可以说,它使直观地扫描代码比列出所有的方式更容易。 Clojure 不是 Common Lisp,如果你试图强制它,你会感到痛苦。

如果你真的,真的想这样做,就说你做到了:
user> (defmacro lambda [args & body]
`(fn ~(vec args) ~@body))
user> ((lambda (x) (println x)) "foo")
foo
nil

这不允许您在函数中放置文档字符串或元数据等。我认为您不会想在真正的 Clojure 程序中使用它。

关于lambda - 如何在 Clojure 中将 lambda 实现为名为 "lambda"的函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2497495/

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