Clojure Special Formsのコレクションをプログラムで取得する方法はありますか?

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