¿Hay una manera de conseguir una colección de formas especiales clojure programación?

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

  •  01-10-2019
  •  | 
  •  

Pregunta

hace algo similar a esto existe:?

(deftest fantasy
   (is (= ["let" "def" "ns" "etc."] clojure.core/special-chars)))
¿Fue útil?

Solución

No creo que hay una buena manera de hacerlo.

Pero aquí hay un truco (correr en una hemorragia de punta instantánea 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 utilizar esto en el código de producción.

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

Así que si realmente desea una lista de formas especiales, me gustaría sugerir a escribir la lista sí mismo. La lista es lo suficientemente corto (todo lo que aparece en http://clojure.org/special_forms ). Mira el origen de clojure.core/special-form-anchor, hay una lista no modificable 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
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top