Есть ли способ получить коллекцию специальных форм clojure программно? - PullRequest
8 голосов
/ 01 июля 2010

Существует ли что-то похожее на это?:

(deftest fantasy
   (is (= ["let" "def" "ns" "etc."] clojure.core/special-chars)))

1 Ответ

9 голосов
/ 01 июля 2010

Я не думаю, что есть хороший способ сделать это.

Но вот хак (запустить на мгновенном снимке 1.2):

user> (map (comp name first) (seq clojure.lang.Compiler/specials))
("deftype*" "new" "quote" "&" "var" "set!" 
 "monitor-enter" "recur" "." "case*" "import*" 
 "reify*" "do" "fn*" "throw" "monitor-exit" "letfn*" 
 "finally" "let*" "loop*" "try" "catch" "if" "def")

Это зависит от деталей реализации компилятора.Пожалуйста, не используйте это в рабочем коде.

Обратите внимание, что let считается специальной формой, даже если это действительно нормальный макрос, а let* является действительной специальной формой.То же самое с fn и другими.Вероятно, это детали реализации, которые могут быть изменены в будущем.

Так что, если вы действительно хотите получить список специальных форм, я бы посоветовал напечатать этот список самостоятельно.Список достаточно короткий (все, что перечислено в http://clojure.org/special_forms). Посмотрите на источник для clojure.core/special-form-anchor, там есть жестко закодированный список для копирования / вставки (опять же, вероятно, деталь реализации не будет использована)

#{'. 'def 'do 'fn 'if 'let 'loop 'monitor-enter 'monitor-exit 'new 'quote 'recur 'set! 'throw 'try 'var}

И еще есть это:

user> (clojure.core/special-symbol? 'if)
true
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...