Существует ли способ получить набор clojure специальных форм программно?

Что-то подобное этому существуют?:

(deftest fantasy
   (is (= ["let" "def" "ns" "etc."] clojure.core/special-chars)))
8
задан Nick Orton 1 July 2010 в 16:42
поделиться

1 ответ

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

Но вот хак (запускаемый на новейшем снимке состояния 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
9
ответ дан 5 December 2019 в 18:56
поделиться
Другие вопросы по тегам:

Похожие вопросы: