2015-06-19 14 views
7

Im Rahmen der Verbesserung von Cider's Debugger muss ich spezielle Handhabung für alle möglichen Sonderformen implementieren. Um Wörter zu verstehen, muss ich alle Symbole kennen, die special-symbol? erfüllen. Die Doc-Seite auf Special Forms, obwohl hilfreich, bietet nicht alle von ihnen.Was sind alle besonderen Formen von Clojure?

Zum Beispiel nach einigen Experimenten habe ich gelernt, dass

  1. Die meisten der aufgeführten Formen gibt ein * Gegenstück (let* und loop*, zum Beispiel).
  2. Es gibt ein clojure.core/import* Sonderzeichen (das würde ich nicht, wenn nicht für reines Glück gefunden haben).

Gibt es eine vollständige Liste aller Sonderzeichen?
Gibt es alternativ eine Möglichkeit, alle intern gespeicherten Symbole aufzulisten? Wenn ja, dann könnte ich über special-symbol? filtern.

Antwort

14

bei der Definition von special-symbol? Suche bietet einen großen Hinweis:

(defn special-symbol? 
    "Returns true if s names a special form" 
    {:added "1.0" 
    :static true} 
    [s] 
    (contains? (. clojure.lang.Compiler specials) s)) 

So:

user=> (pprint (keys (. clojure.lang.Compiler specials))) 
(& 
monitor-exit 
case* 
try 
reify* 
finally 
loop* 
do 
letfn* 
if 
clojure.core/import* 
new 
deftype* 
let* 
fn* 
recur 
set! 
. 
var 
quote 
catch 
throw 
monitor-enter 
def) 
+0

Verdammt, jetzt embarassed ich bin. Vergessen, die Quelle zu verwenden. – Malabarba