Clojure 宏为函数创建同义词

标签 clojure macros

对于任何真正知道如何在任何 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/

相关文章:

Clojure:如何在 project.clj 中设置 :repositories

Python Jinja2 宏空白问题

c++ - 使用宏访问 C 中的结构成员名称

performance - 为什么 Clojure/Lisp 程序比其他动态语言更快?

mysql - clostache/render 函数中是否有多个参数?

namespaces - clojure - 不同命名空间中的 eval 代码

clojure - 如何在clojure中按映射顺序重命名键

list - 宏观范围内的Cmake全局变量

python - 如何编写在 python 而不是 shell 中执行的 ipython 别名?

macros - 旁边不需要空格的 Clojure 宏