Странное поведение ключевых слов в макросах в Clojure - PullRequest
4 голосов
/ 19 мая 2010

Меня немного смущает то, как доступ к ключевым словам, кажется, ведет себя в Clojure, когда они оцениваются во время раскрытия макроса.

Следующие работы, как я ожидаю:

(def m {:a 1})
(:a m)
=> 1 

Однако тот же доступ к ключевому слову не работает в макросе:

(def m {:a 1})
(defmacro get-a [x] (:a x))
(get-a m)
=> nil

Есть идеи, что здесь происходит?

1 Ответ

8 голосов
/ 19 мая 2010

Вы должны принять во внимание, что макросы не оценивают свои аргументы, если вы не укажете им это. В вашей версии get-a получает символ m, а результат - не код, а ключевое слово: поиск самого символа, который, очевидно, равен нулю. Это работает однако:

(defmacro get-a [x] `(:a ~x))

Результатом вызова этого макроса с аргументом m является выражение '(: a m)', которое оценивается как 1 в вашем контексте.

...