2016-11-18 2 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

Спасибо. К сожалению, это не работает, не требуя пространства имен. –

Смежные вопросы