2010-07-01 21 views

Respuesta

9

No creo que hay una buena manera de hacerlo.

Pero aquí hay un truco (ejecutarse en una instantánea bleeding-edge 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") 

Esto se basa en detalles de implementación del compilador. Por favor, no use esto en el código de producción.

Tenga en cuenta que let se considera una forma especial, aunque en realidad es una macro normal y let* es la forma especial real. Lo mismo con fn y otros. Estos son probablemente detalles de implementación, sujetos a cambios en el futuro.

Así que si realmente desea una lista de formularios especiales, le sugiero que escriba la lista usted mismo. La lista es lo suficientemente corta (todo enumerado en http://clojure.org/special_forms). Mira la fuente para clojure.core/special-form-anchor, hay una lista codificada allí para copiar/pegar. (Una vez más, probablemente, un detalle de implementación de no ser invocada sin embargo.)

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

Y también esto:

user> (clojure.core/special-symbol? 'if) 
true 
Cuestiones relacionadas