8
是否与此类似?:存在有没有办法以编程方式获得clojure特殊形式的集合?
(deftest fantasy
(is (= ["let" "def" "ns" "etc."] clojure.core/special-chars)))
是否与此类似?:存在有没有办法以编程方式获得clojure特殊形式的集合?
(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