Я пытаюсь реализовать ленивую последовательность (которая должна сгенерировать одну строку) в REPL, без везения. Исходный код работает отлично:Выполнение ленивой последовательности (строки) Clojure в REPL
(def word_list ["alpha" "beta" "gamma" "beta" "alpha" "alpha" "beta" "beta" "beta"])
(def word_string (reduce str (interpose " " word_list)));
word_string ; "alpha beta gamma beta alpha alpha beta beta beta"
Но не желая оставить в покое, я задавался вопросом, что еще будет работать, и попытался удалить reduce
, думая, что str
может иметь тот же эффект. Это не ...
(def word_string (str (interpose " " word_list)))
word_string ; "[email protected]"
Я попробовал очевидное, используя reduce
снова, но это не сработало. Там в another question о реализации ленивых последовательностей, которые казались многообещающими, но ничего я пытался не работал:
(reduce str word_string) ; "[email protected]"
(apply str word_string) ; "[email protected]"
(println word_string) ; "[email protected]"
(apply list word_string) ; [\c \l \o \j \u \r \e \. \l \a \n \g \. \L \a \z \y...]
(vec word_string) ; [\c \l \o \j \u \r \e \. \l \a \n \g \. \L \a \z \y...]
(apply list word_string) ; (\c \l \o \j \u \r \e \. \l \a \n \g \. \L \a \z \y...)
(take 100 word_string) ; (\c \l \o \j \u \r \e \. \l \a \n \g \. \L \a \z \y...)
Тот факт, что некоторые из вариантов, дал мне символы в «clojure.lang.LazySeq» также беспокоит меня - сделал Я как-то теряю фактическое значение строки, а моя ссылка имеет значение «clojure.lang.LazySeq»? Если нет, то как я действительно реализую ценность?
Чтобы уточнить: учитывая, что word_string
назначен ленивой последовательности, как бы я это понял? Что-то вроде (realize word_string)
, скажем, если это существовало.
Update: на основе принятого Ответ и как str
работы, то получается, что я может получить фактическое значение последовательности, а не только его имя:
(reduce str "" word_string) ; "alpha beta gamma beta alpha alpha beta beta beta"
Да, это ужасно код , :) Я просто пытался понять, что происходит, почему он ломается, и действительно ли фактическое значение там или нет.
Я предполагаю, что я не понял свой вопрос - мне удалось передать полностью реализованную строку в 'word_string', используя' reduce', хотя «apply» может быть лучше. Но учитывая, что 'word_string' _was_ назначен ленивой последовательности, как я это понимаю? Какую операцию я бы применил к 'word_string', например' (реализовать word_string) '? –
Я думаю, вы в замешательстве: второе назначение word_string не означает ленивую последовательность; это строка, которая приводит к вызову .toString в ленивой последовательности. Строковое представление ленивой последовательности не очень полезно и не то, что вы хотите. См. Этот вопрос: http://stackoverflow.com/questions/7946219/why-does-my-string-function-return-a-clojure-lang-lazyseqxxxxxx –
Да, я определенно смущен. :) Есть много странных, ошибочных, неинтуитивных аспектов для Clojure, ленивых последовательностей и т. Д., Что я все еще работаю над пониманием. Однако, я думаю, я вижу, что произошло в этом случае, _str_ не делает то, что я изначально думал. Благодарю. –