gpt4 book ai didi

clojure - 在 clojure 中如何定义 defmacro 本身?

转载 作者:行者123 更新时间:2023-12-03 00:29:19 24 4
gpt4 key购买 nike

我一直在查看 defmacro 的源代码,它在定义中使用“let”:

(def

^{:doc "Like defn, but the resulting function name is declared as a
macro and will be used as a macro by the compiler when it is
called."
:arglists '([name doc-string? attr-map? [params*] body]
[name doc-string? attr-map? ([params*] body)+ attr-map?])
:added "1.0"}
defmacro (fn [&form &env
name & args]
(let [prefix (loop [p (list name) args args]

但是,“let”本身被定义为宏:

(defmacro let
"binding => binding-form init-expr

Evaluates the exprs in a lexical context in which the symbols in
the binding-forms are bound to their respective init-exprs or parts
therein."
{:added "1.0", :special-form true, :forms '[(let [bindings*] exprs*)]}
[bindings & body]
(assert-args
(vector? bindings) "a vector for its binding"
(even? (count bindings)) "an even number of forms in binding vector")
`(let* ~(destructure bindings) ~@body))

有人可以解释一下这是如何工作的,因为我无法理解如何根据需要定义“defmacro”的事物来定义“defmacro”。 (如果这是有道理的:)

最佳答案

这是可能的,因为在 core.clj 中定义 defmacro 函数之前,在 this location 处已经有 let 的定义。 (稍后会重新定义)。宏只是普通函数,它们绑定(bind)的 var 具有元数据键 :macro 和值 true,以便在编译时编译器可以区分宏(执行在编译时)使用函数,如果没有这个元键,就无法区分宏和函数,因为宏本身就是一个恰好处理 S 表达式的函数。

关于clojure - 在 clojure 中如何定义 defmacro 本身?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12207008/

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