Clojure Special Formsのコレクションをプログラムで取得する方法はありますか?
-
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
所属していません StackOverflow