【问题标题】:Resolve symbol in macro解析宏中的符号
【发布时间】:2016-11-18 15:02:47
【问题描述】:

我被一个看似基本的东西困住了。我有一个命名空间,其中有一些定义:

(ns my-namespace)

(def my-definition "HELLO")
(def my-definition2 "HI")

现在,我想在宏中使用my-namespace 中的变量值,但我想动态检索符号。例如,

(defmacro my-macro [n]
  (-> "my-namespace/my-definition" symbol resolve var-get))

以这种方式检索符号在函数中有效(只要命名空间被加载),但在宏中无效。

在宏中,无法解析符号。我已经尝试过引用和取消引用,但它仍然不起作用。

是否可以在宏中使用这样创建的符号的值?如果有,怎么做?

【问题讨论】:

  • my-namespace 需要在 my-macro 展开之前加载。是这样吗?
  • 在宏命名空间声明中添加(require [my-namespace :refer :all]) 解决了这个问题。如果您发布答案,您可以在@OlegTheCat 中获得一些分数,如果您对此感兴趣的话。

标签: clojure


【解决方案1】:

试试这个:

(defmacro my-macro
  [str]
  (-> str symbol resolve deref))

【讨论】:

  • 谢谢。不幸的是,如果不需要命名空间,它就无法工作。
【解决方案2】:

无法解析符号,因为未加载定义它的命名空间。您可以通过

加载命名空间
(require 'my-namespace)

或在命名空间声明中:

(ns macro-expansion-ns
  (:require [my-namespace]))

【讨论】:

    猜你喜欢
    • 2019-09-05
    • 1970-01-01
    • 2015-06-17
    • 1970-01-01
    • 1970-01-01
    • 2019-02-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多