Спасибо всем за красивые ответы! Нельзя отметить только один правильный
Примечание: уже вики
Я новичок в функциональном программировании, и хотя я могу читать простые функции в функциональном программировании, например. вычисляя факторный ряд, мне трудно читать большие функции.
Частично я думаю, из-за моей неспособности вычислить меньшие блоки кода в определении функции, а также отчасти потому, что мне становится трудно соответствовать ( )
в коде.
Было бы здорово, если бы кто-нибудь смог пройти через чтение кода и дать мне несколько советов о том, как быстро расшифровать код.
Примечание. Я могу понять этот код, если я смотрю на него в течение 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))))