Perché questo codice funziona?Perché questo codice funziona anche se non ha una parentesi aperta
(defn g []
do (println 10) (println 20))
Nota: Non c'è (prima il fai
Perché questo codice funziona?Perché questo codice funziona anche se non ha una parentesi aperta
(defn g []
do (println 10) (println 20))
Nota: Non c'è (prima il fai
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.
Grazie. Quindi, è esplicitamente codificato un'eccezione. Qualche idea del perché? – Tim
@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 * '. –
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