Есть ли способ получить коллекцию специальных форм Clojure Special?

StackOverflow https://stackoverflow.com/questions/3159836

  •  01-10-2019
  •  | 
  •  

Вопрос

Что-то похожее на это существует?:

(deftest fantasy
   (is (= ["let" "def" "ns" "etc."] clojure.core/special-chars)))
Это было полезно?

Решение

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

Но вот взлом (бегите на кровотечении 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
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top