2016-11-18 89 views
5

我被困在一個看似基本的東西上。我有一個命名空間,我有一些定義:解析宏中的符號

(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)) 

以這種方式檢索符號在函數中(只要命名空間被加載)工作,但不在宏中。

在宏中,符號無法解析。我試過引用和不引用,但它仍然不起作用。

在宏中可以使用像這樣創建的符號的值嗎?如果是這樣,怎麼樣?

+3

'我-namespace'需要'我-macro'展開之前加載。這是嗎? – OlegTheCat

+1

向宏名稱空間聲明添加'(require [my-namespace:refer:all])'解決了問題。如果你發佈了一個答案,你可以在@OlegTheCat上得分,如果你對此感興趣的話。 –

回答

2

符號不能得到解決,因爲未加載定義它的命名空間。您可以通過

(require 'my-namespace) 

或命名空間聲明裝載名稱空間:

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

試試這個:

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

謝謝。不幸的是,它不需要命名空間就無法工作。 –