Y at-il un moyen d'obtenir une collection de formes spéciales de clojure programmation?

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

  •  01-10-2019
  •  | 
  •  

Question

Est-ce que quelque chose de semblable à ce exist:

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

La solution

Je ne pense pas qu'il y ait une bonne façon de le faire.

Mais voici un hack (courir sur un instantané saignement pointe 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")

se fonde sur les détails de mise en œuvre du compilateur. S'il vous plaît ne pas utiliser ce dans le code de production.

Notez que let est considérée comme une forme particulière, même si elle est vraiment une macro normale et let* est la forme réelle spéciale. Même avec fn et d'autres. Ce sont probablement les détails de mise en œuvre, sous réserve de modifications à l'avenir.

Donc, si vous voulez vraiment une liste des formes spéciales, je vous suggère de taper la liste vous-même. La liste est assez courte (tous les éléments énumérés sur http://clojure.org/special_forms ). Regardez la source clojure.core/special-form-anchor, il y a une liste codée en dur là pour copier / coller. (Encore une fois sans doute un détail de mise en œuvre ne doit pas être invoqué si.)

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

Et il y a aussi ceci:

user> (clojure.core/special-symbol? 'if)
true
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top