Имеет ли символ Clojure, начинающийся с &, особое значение? - PullRequest
2 голосов
/ 24 мая 2019

Я просматривал core.clj в исходном коде Clojure и наткнулся на определение defn.Функция, которую она определяет, принимает несколько аргументов, первым из которых являются &form и &env:

(def
 defn (fn defn [&form &env name & fdecl]
  ;; ...
  ))

Эти имена приобретают особое значение, поскольку они начинаются с &?

Я знаю об остальных аргументах и ​​сокращенной анонимной функции var %&, но это, похоже, не из тех вещей.

Я не смог ничего найти оэтот синтаксис в справочнике Reader , в котором явно не упоминается &:

Символы начинаются с нецифровых символов и могут содержать буквенно-цифровые символы и *, +,!, -, _, ',?, <,> и = (другие символы могут быть в конечном итоге разрешены).

Чтение символов Clojure также не упоминает об этом,resolve включает &env arg в строку документа, но не уточняет.

1 Ответ

8 голосов
/ 24 мая 2019

Символы &form и &env представляют специальные переменные, используемые в макросах Clojure: https://clojure.org/reference/macros#_special_variables.

В частности, вы можете использовать переменную &form для доступа к номеру строки, с которой макросоценивается

(:line (meta &form))

, что полезно при печати сообщений об ошибках и т. д.


Дополнительная информация о поиске сложных символов:

SymbolHound.com - это поисковая система, которая не выделяет такие символы, как Google, поэтому вы можете часто находить там результаты, которые вы не можете найти в других местах.Поиск clojure &form дает результаты .


Обновление

Глядя на исходный код , мы видим, чтов процессе начальной загрузки Clojure fn - это макрос, использующий fn*:

(def
 ^{:macro true
   :added "1.0"}
 fn (fn* fn [&form &env & decl] 
         (.withMeta ^clojure.lang.IObj (cons 'fn* decl) 
                    (.meta ^clojure.lang.IMeta &form))))

Таким образом, компилятор вводит &form и т. д.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...