Clojure макросы и привязка символов - PullRequest
3 голосов
/ 30 октября 2010

не уверен, как это выразить ..

Я написал макрос, который принимает два аргумента. Первый по существу содержит идентификаторы для генерации выражения let. Второй - это код, используемый внутри выражения let (он хочет иметь доступ к этим идентификаторам).

Пример:

(match (Add {ast-> x}) (println x))

Когда вторым аргументом является необработанный код, все работает хорошо. x связывается с x, определенным в выражении let (при расширении макроса он просто отображается как x). Однако, когда второй аргумент является макросом, который генерирует (println x), x расширяется до чего-то вроде user / x.

Есть хорошие идеи, как это исправить?

1 Ответ

6 голосов
/ 30 октября 2010

Похоже, ваш второй макрос определен как:

(defmacro foo
  []
  `(println x))

Это неверно, поскольку x будет квалифицировано для пространства имен. Правильная версия второго макроса в этом случае будет:

(defmacro foo
  []
  `(println ~'x))

Теперь x в вызове println будет литеральным символом x и не будет соответствовать пространству имен.

...