Grazie mille per tutte le bellissime risposte! Non può segnare solo uno come correttaCome leggere mentalmente codice Lisp/Clojure
Nota: Already a wiki
Sono nuovo di programmazione funzionale e mentre posso leggere semplici funzioni di programmazione funzionale, per esempio calcolando il fattoriale di un numero, trovo difficile leggere grandi funzioni. Parte del motivo è che penso a causa della mia incapacità di capire i blocchi di codice più piccoli all'interno di una definizione di funzione e anche in parte perché mi risulta difficile per me corrispondere a ()
nel codice.
Sarebbe bello se qualcuno potesse guidarmi leggendo un codice e darmi alcuni suggerimenti su come decifrare rapidamente un codice.
Nota: riesco a capire questo codice se lo fisso per 10 minuti, ma dubito che se questo stesso codice fosse stato scritto in Java, ci sarebbero voluti 10 minuti. Quindi, penso di sentirmi a mio agio nel codice stile Lisp, devo farlo più velocemente
Nota: so che questa è una domanda soggettiva. E non sto cercando alcuna risposta provabilmente corretta qui. Proprio commenti su come si fa a leggere questo codice, sarebbe il benvenuto e altamente disponibile
(defn concat
([] (lazy-seq nil))
([x] (lazy-seq x))
([x y]
(lazy-seq
(let [s (seq x)]
(if s
(if (chunked-seq? s)
(chunk-cons (chunk-first s) (concat (chunk-rest s) y))
(cons (first s) (concat (rest s) y)))
y))))
([x y & zs]
(let [cat (fn cat [xys zs]
(lazy-seq
(let [xys (seq xys)]
(if xys
(if (chunked-seq? xys)
(chunk-cons (chunk-first xys)
(cat (chunk-rest xys) zs))
(cons (first xys) (cat (rest xys) zs)))
(when zs
(cat (first zs) (next zs)))))))]
(cat (concat x y) zs))))
Esperienza? Se ti abitui a leggere il codice Lisp, sarà più veloce. Tuttavia, una delle principali lamentele su Lisp è che è difficile da leggere, quindi non aspettarti che diventi intuitivo per te rapidamente. –
Questa non è una funzione facile. Se riesci a capirlo pienamente dopo 10 minuti, stai bene. –