Велике спасибі за всі гарні відповіді! Не можна позначити лише одну як правильну
Примітка: Вже вікі
Я новачок у функціональному програмуванні, і хоча я можу читати прості функції у функціональному програмуванні, наприклад, обчислюючи факторіал числа, мені важко читати великі функції. Частково причина полягає в тому, що я думаю через мою нездатність з'ясувати менші блоки коду в межах визначення функції, а також частково тому, що мені стає важко зіставити ( )
код.
Було б чудово, якби хтось міг провести мене з читанням коду та дати кілька порад щодо швидкого розшифрування коду.
Примітка: Я можу зрозуміти цей код, якщо дивлюсь на нього протягом 10 хвилин, але я сумніваюся, що якщо цей самий код був написаний на Java, це займе у мене 10 хвилин. Отже, я думаю, щоб почувати себе комфортно в коді стилю Lisp, я повинен зробити це швидше
Примітка: Я знаю, що це суб’єктивне питання. І я не шукаю тут жодної доказово правильної відповіді. Лише коментарі щодо того, як ви читаєте цей код, будуть вітаються та дуже корисні
(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))))