【发布时间】:2015-10-31 14:18:25
【问题描述】:
我试图在 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 ; "clojure.lang.LazySeq@304a9790"
我尝试了显而易见的方法,再次使用reduce,但这也没有用。有 another question 关于实现似乎很有希望的惰性序列,但我尝试过的都没有:
(reduce str word_string) ; "clojure.lang.LazySeq@304a9790"
(apply str word_string) ; "clojure.lang.LazySeq@304a9790"
(println word_string) ; "clojure.lang.LazySeq@304a9790"
(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),如果存在的话。
更新:根据接受的答案以及str 的工作原理,我可以获得实际的序列值,而不仅仅是它的名称:
(reduce str "" word_string) ; "alpha beta gamma beta alpha alpha beta beta beta"
是的,这是一个糟糕的代码。 :) 我只是想了解发生了什么,为什么会中断,以及实际值是否仍然存在。
【问题讨论】:
标签: clojure lazy-evaluation lazy-sequences