Когда я пытаюсь добавить метаданные в бесконечную ленивую последовательность в Clojure, я получаю переполнение стека, и если я снимаю метаданные, то это работает отлично. Почему добавление макроса with-meta
прерывает ленивый seq?Добавление метаданных в ленивую последовательность
Сначала нужно создать бесконечную SEQ из очень хорошего номера:
(defn good [] (lazy-seq (cons 42 (good)))) user> (take 5 (good)) (42 42 42 42 42)
Затем добавить некоторые метаданные для каждого из ленивых-слы случаев:
(defn bad [] (lazy-seq (cons 42 (with-meta (bad) {:padding 4})))) user> (take 5 (bad)) java.lang.StackOverflowError (NO_SOURCE_FILE:0) [Thrown class clojure.lang.Compiler$CompilerException]
Попробуйте переместить мета-данные до одного уровень:
(defn also-bad [] (with-meta (lazy-seq (cons 42 (also-bad))) {:padding 4})) user> (take 5 (foo)) java.lang.StackOverflowError (NO_SOURCE_FILE:0) [Thrown class clojure.lang.Compiler$CompilerException]
Ниже приведен пример метаданных на конечной последовательности:
(defn also-works [] (lazy-seq (cons 4 (with-meta () {:a 5})))) user> (also-works) (4) user> (meta (rest (also-works))) {:a 5} user>
Оба lazy-seq и with-meta являются макросами, поэтому вы должны иметь возможность получить дополнительную информацию о макроэкспоненте и. MACROEXPAND-1. – Svante