gpt4 book ai didi

Clojure 宏为函数创建同义词

转载 作者:行者123 更新时间:2023-12-02 04:06:56 25 4
gpt4 key购买 nike

对于任何真正知道如何在任何 Lisp 中编写宏的人来说,这可能是一个简单的方法。我希望能够定义函数名称的同义词。我一直在复制粘贴 hack core.clj 来做到这一点,但我不想永远成为这样的傻瓜!显然,将同义词函数的调用重写为对原始函数的调用的宏是正确的方法。

最佳答案

如果我理解你的问题,有一个更简单的方法:将新符号定义为旧函数。

user=> (def foo +)
#'user/foo
user=> (foo 1 2)
3
<小时/>

def 的性能也优于宏方法:

(defmacro foo2 [& args]
`(+ ~@args))

foo2 实际上是 + 的别名,其行为方式完全相同(重写为 +),除了使用必须返回值的宏的限制。

如果您希望“别名”的行为与原始函数的行为完全相同(也可以在相同的上下文中调用),那么您需要使用 def 来重命名该函数。

user=> (def foo +)

user=> (defn foo1 [& args]
`(+ ~@args))

user=> (defmacro foo2 [& args]
`(+ ~@args))

user=> (time (dotimes [n 1000000] (foo 1 n)))
"Elapsed time: 37.317 msecs"

user=> (time (dotimes [n 1000000] (foo1 1 n)))
"Elapsed time: 292.767 msecs"

user=> (time (dotimes [n 1000000] (foo2 1 n)))
"Elapsed time: 46.921 msecs"

关于Clojure 宏为函数创建同义词,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1315099/

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