【发布时间】:2020-07-02 20:50:31
【问题描述】:
我正在研究 Clojure,并且我读到在 Clojure 中,函数定义只是数据,即参数向量只是一个普通向量。如果是这样,我为什么要这样做
(def add (fn [a b]
(+ a b)))
但不是这个
(def vector-of-symbols [a b])
?
我知道我通常必须像这样转义符号:
(def vector-of-symbols [`a `b])
但我为什么不用fn/defn 做呢?我认为这是因为 fn/defn 是宏。我尝试检查它们的来源,但到目前为止它们对我来说太先进了。我重新创建defn 的尝试也失败了,我不知道为什么(我从教程中举了一个例子):
(defmacro defn2 [name param & body]
`(def ~name (fn ~param ~@body)))
(defn2 add [a b] (+ a b)) ;;I get "Use of undeclared Var app.core/defn2"
谁能解释一下,Clojure 究竟是如何将数据结构,尤其是符号,转化为代码的?我对宏示例缺少什么?
更新 显然,宏不起作用,因为我的项目实际上是在 Clojurescript 中(在 Clojure 中它确实有效)。我认为这并不重要,但随着我的进步 - 我发现越来越多的东西在 Clojurescript 中对我不起作用。
【问题讨论】:
-
你的
defn2宏对我来说很好用。确保在定义它的同一个命名空间中调用它,或使用完全限定名称。
标签: function clojure binding symbols lexical-scope