有没有办法以编程方式获取clojure特殊形式的集合?

Nic*_*ton 8 clojure special-form

有类似的东西存在吗?:

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

Bri*_*per 9

我不认为这是一个很好的方法.

但这是一个黑客(运行在前沿的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")
Run Code Online (Sandbox Code Playgroud)

这依赖于编译器的实现细节.请不要在生产代码中使用它.

请注意,它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}
Run Code Online (Sandbox Code Playgroud)

还有这个:

user> (clojure.core/special-symbol? 'if)
true
Run Code Online (Sandbox Code Playgroud)