C'è un modo per ottenere un insieme di forme clojure speciali a livello di programmazione?

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

  •  01-10-2019
  •  | 
  •  

Domanda

fa qualcosa di simile a questo esiste:?

(deftest fantasy
   (is (= ["let" "def" "ns" "etc."] clojure.core/special-chars)))
È stato utile?

Soluzione

Non credo che ci sia un buon modo per farlo.

Ma ecco un hack (eseguito su un 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")

Questa si basa su dettagli di implementazione del compilatore. Si prega di non utilizzare questo nel codice di produzione.

Si noti che let è considerato una forma speciale, anche se è davvero una macro normale e let* è la forma speciale vero e proprio. Stessa cosa con fn e altri. Questi sono probabilmente i dettagli di implementazione, soggetto a modifiche in futuro.

Quindi, se si vuole veramente un elenco di moduli speciali, suggerirei a digitare la lista da soli. La lista è abbastanza breve (tutto quotata http://clojure.org/special_forms ). Guardate la fonte per clojure.core/special-form-anchor, c'è una lista di hard-coded lì per copia / incolla. (Anche in questo caso probabilmente un dettaglio di implementazione di non essere invocato però.)

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

E c'è anche questo:

user> (clojure.core/special-symbol? 'if)
true
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top