如何在Clojure中将param变量解析为符号?

时间:2014-05-13 04:55:03

标签: parsing variables clojure compilation scope

我想将符号作为参数传递给函数,并将该符号捕获为带引号或字符串,以便它可以与最后标记的-a连接,然后使用新生成的符号定义一个原子。但是在评估符号之前有没有办法做到这一点?

(defn sym-a [variable] (symbol (str variable "-a")))


   (defn sym-val [old-sym]
      (let [ new-sym (sym-a old-sym)]
        `(def ~new-sym (atom nil))))

当我使用宏时,它有效,但我想知道是否有办法避免这种情况?

(defmacro sym-val [old-sym]
   (let [ new-sym (sym-a old-sym)]
    `(def ~new-sym (atom nil))))

1 个答案:

答案 0 :(得分:2)

评估符号时,除非您使用quote或其简写'明确阻止评估,否则将在当前绑定上下文中对其进行解析。

例如:

(def foo-log 42)
(log-name foo)
;; CompilerException java.lang.RuntimeException: Unable to resolve symbol: foo in this context, compiling:(/tmp/form-init735849253251327390.clj:1:1)

(log-name 'foo)
=> foo-log

(eval (log-name 'foo))
=> 42

您可以编写一个宏,其中不评估参数列表并返回创建的符号以进行评估。

(defmacro log-name-macro
  [channel-name]
  (log-name channel-name))

(log-name-macro foo)
=> 42

在您的示例中,您现在需要将log-put写为宏。

我不推荐这种方法来解决你的问题。