Я играю с clojure, точнее с ленью.Я попробовал этот кусок кода:
(defn even-numbers
([] (even-numbers 0))
([n] (cons n (lazy-seq (even-numbers (+ n 2))))))
(take 1 (even-numbers 0))
Это довольно идиоматично, я не думаю, что с этим что-то не так.
Проблема в том, что я использую cider в emacs.Если я сначала оцениваю defn, а потом оцениваю вызов функции, я получаю переполнение стека.Оценка всего буфера в порядке.
Я подозреваю, что виноват режим просветления, так как я не получаю переполнение, когда отключаю его.Я просто хочу понять, что здесь происходит.
[РЕДАКТИРОВАТЬ] Я совершенно уверен, что проблема связана с режимом просветления сидра.отключая его, я никогда не получаю переполнение стека.
Чтобы немного углубиться в это, учитывая слегка измененный отрывок:
(ns clojure-noob.bizarerrie)
(defn even-numbers
([] (even-numbers 0))
([n] (do (println (even-numbers (+ n 2)))
(cons n (lazy-seq (even-numbers (+ n 2)))))))
(take 1 (even-numbers 0))
, который также дает переполнение стека в каждом случае.Так как в режиме просветления попытайтесь разрешить выражение для вывода во время выполнения на лету;Интуитивно я бы сказал, что он пытается напечатать форму (even-numbers (+ n 2))
(например, только что добавленную печать), что вызывает переполнение стека.