È possibile definire due funzioni in clojure che si richiamano reciprocamente? Ad esempio, questa coppia:Due funzioni che si richiamano in modo ricorsivo
(defn a [x]
(if (= 0 x) 0 (b (dec x))))
(defn b [x]
(if (= 0 x) 0 (a (dec x))))
compilazione fallisce con:
Unable to resolve symbol: b in this context
Non avendo definito b
quando provo a richiamare in a
.
per esempio, in ruby questo funziona bene:
def a(x)
x == 0 ? x : b(x-1)
end
def b(x)
x == 0 ? x : a(x-1)
end
Ha senso, immagino ci sia un compromesso per la velocità di compilazione che non può guardare avanti per le definizioni di funzione. Grazie alla risposta cancellata per questo link ai documenti (http://clojuredocs.org/clojure_core/clojure.core/declare) – spike
Il compromesso non è per la velocità di compilazione, ma per gli errori di cattura. Esiste anche la funzione 'resolve' quando due namespace devono fare reciprocamente riferimento tra loro. – noisesmith
Hai un link per maggiori informazioni a riguardo? Che tipo di errori vengono evitati dal compilatore ignorando le definizioni di funzioni esplicite? – spike