2014-07-01 4 views

risposta

8

In teoria questo dovrebbe nemmeno compilare il compilatore dovrebbe lamentarsi che do non può essere risolto dal momento che è un simbolo speciale non nel primo.. posizione di un modulo.

si tratta di un (probabile non intenzionale) conseguenza di utilizzare lo stesso BodyExpr parsing code sia per la forma particolare do e il corpo della forma speciale fn*. Quando si compila un modulo speciale do, il principale do viene eliminato e vengono compilati i moduli rimanenti. Usando questo stesso parser per un corpo di una funzione si può anche visualizzare un singolo n. do per primo.

public static class BodyExpr implements Expr, MaybePrimitiveExpr{ 

    ... 

    public Expr parse(C context, Object frms) { 
     ISeq forms = (ISeq) frms; 
     if(Util.equals(RT.first(forms), DO)) 
      forms = RT.next(forms); 

    .... 

Si noterà che se la do si ripete, questa

(defn g [] do do (println 10) (println 20)) 
;=> CompilerException java.lang.RuntimeException: 
     Unable to resolve symbol: do in this context ... 

fa non di compilazione, come previsto.

+0

Grazie. Quindi, è esplicitamente codificato un'eccezione. Qualche idea del perché? – Tim

+0

@Tim Vedi modifica. Questa è una conseguenza (probabilmente non intenzionale) dell'uso dello stesso parser sia per la forma speciale 'do' che per il corpo della forma speciale della funzione,' fn * '. –

+0

Che strano ... mi sarei aspettato qualcosa del tipo: '=> ((fn [] println println)) ;; # ', ma questa eccezione sembra essere il caso per tutti i moduli speciali. '((fn [] if))', ad esempio, lancia lo stesso RTE. – dsm

Problemi correlati