Gibt es eine Möglichkeit, eine Sammlung von clojure Sonderformen programmatisch zu bekommen?

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

  •  01-10-2019
  •  | 
  •  

Frage

Hat etwas ähnlich wie diese sind:?

(deftest fantasy
   (is (= ["let" "def" "ns" "etc."] clojure.core/special-chars)))
War es hilfreich?

Lösung

Ich glaube nicht, dass es ein guter Weg, es zu tun.

Aber hier ist ein Hack (lief auf einem bleeding-edge 1.2 Snapshot):

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")

Dies wird sich auf Details der Implementierung des Compilers. Bitte verwenden Sie diese nicht im Produktionscode.

Beachten Sie, dass let eine besondere Form betrachtet wird, auch wenn es wirklich ein normaler Makro und let* ist die tatsächliche besondere Form. Das Gleiche gilt für fn und andere. Dies sind wahrscheinlich Implementierungsdetails, Änderungen vorbehalten in der Zukunft.

Wenn Sie also wirklich eine Liste mit Sonderformen wollen, würde ich vorschlagen Eingabe die Liste selbst. Die Liste ist kurz genug (alle aufgeführten Teile auf http://clojure.org/special_forms ). Schauen Sie sich die Quelle für clojure.core/special-form-anchor, gibt es eine hartcodierte Liste dort kopieren / einfügen. (Auch hier wahrscheinlich eine Implementierung Detail nicht auf, obwohl verlassen zu werden.)

#{'. 'def 'do 'fn 'if 'let 'loop 'monitor-enter 'monitor-exit 'new 'quote 'recur 'set! 'throw 'try 'var}

Und es gibt auch diese:

user> (clojure.core/special-symbol? 'if)
true
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top