ho incontrato lo StackOverflowError per il seguente codice:java.lang.StackOverFlowError in clojure ricorsione in coda
(defn recursive-reverse
([coll] (recursive-reverse [coll nil]))
([coll acc]
(if (= coll '()) acc
(recur (rest coll) (cons (first coll) acc)))))
pur usando ciclo sarebbe farlo funzionare:
(defn recursive-reverse [lst]
(loop [coll lst acc nil]
(if (= coll '()) acc
(recur (rest coll) (cons (first coll) acc)))))
ciò che va male con il codice prima senza anello?
Grazie. Adesso cristallino. – lkahtz
'(nil? X)' potrebbe essere molto più veloce di '(= x())', perché il compilatore può emettere solo una singola operazione bytecode, il primitivo controllo nullo utilizzato da Java. Naturalmente, quest'ultimo è abbastanza veloce, ma ho il sospetto che sia più lento del precedente. Come succede, questo controllo nil ottimizzato non è implementato (ancora?), Ma è una ragionevole ottimizzazione che potrebbe essere fatta alla fine. – amalloy