2015-06-19 16 views
7

Come parte del miglioramento del debugger di Cider, devo implementare una gestione speciale per tutte le possibili forme speciali. Nelle parole di ordine, ho bisogno di conoscere tutti i simboli che soddisfano special-symbol?. La pagina doc su Special Forms, sebbene utile, non offre tutti.Quali sono tutte le forme speciali del clojure?

Per esempio, dopo un po 'di sperimentazione, ho imparato che

  1. La maggior parte dei tipi di cui ci hanno un * controparte (let* e loop*, per esempio).
  2. C'è un simbolo speciale clojure.core/import* (che non avrei trovato se non fosse per pura fortuna).

Esiste un elenco completo di tutti i simboli speciali?
In alternativa, c'è un modo per elencare tutti i simboli internati? Se è così, allora potrei filtrare su special-symbol?.

risposta

14

Guardando la definizione di special-symbol? fornisce un indizio importante:

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

Così:

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

Accidenti, ora sto imbarazzato. Ho dimenticato di usare la fonte. – Malabarba

Problemi correlati