我从 Clojure 开始,这也是我的第一个 lisp。显然有很多东西要吸收,为了减轻认知负担,我尝试找到可以安全忽略的部分(暂时)。
是否可以安全地处理带有宏的表单和带有内置函数的表单,或者是否有以后会出现的陷阱?
换句话说,我是否会遇到需要知道 (defn f1 [])
扩展为
(def f1 (.withMeta (clojure.core/fn f1 ([])) (.meta (var f1))))
最佳答案
一般而言,宏的构成非常不同。宏不是“一等公民”:您不能将它们传递给 map
等,不能将它们存储在变量中,也不能将它们apply
到参数列表。最初您不需要担心这些,因为它们显然 不起作用:细微的、难以检测的错误会更麻烦。如果你尝试运行
(map if [true false true false] [1 2 3 4] [-1 -2 -3 -4])
if 不是函数 的事实将变得非常明显。请记住,宏不是函数,你应该没问题:)
PS:宏是 (fn (fn (fn :-D) :^P) :O)
关于macros - 可以放心地忽略宏和内置宏之间的区别吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5120780/