macros - 可以放心地忽略宏和内置宏之间的区别吗?

标签 macros clojure lisp

我从 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/

相关文章:

macros - 通用建筑枚举的一些错误

lisp - Lisp/Clojure 中的过程和#'过程有什么区别?

javascript - 如何提高 ClojureScript 的性能

lisp - scheme中lambda表达式的解释

java - Atlassian汇合: Macro type plugin that will display a popup window when the page is accessed

Scala 宏 : finding Option's enclosed type

macros - Elixir:在定义它的同一模块的主体中​​使用宏

arrays - 在循环中将 conj 与数组一起使用时出现空指针错误

scheme - 如何在 Racket 中结构复制仅在运行时已知的字段?

mysql - "AS"clsql中的伪运算符语法