我想将符号作为参数传递给函数,并将该符号捕获为带引号或字符串,以便它可以与最后标记的-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))))
答案 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
写为宏。
我不推荐这种方法来解决你的问题。