Clojure China

有关LazySeq问题

#1

微博一则房屋招租信息,Clojure改写一遍。有人写过或发现过类似程序,例如通过程序表达招聘,或个人信息等。

(let [init [8 2 1 0 3]
      order [2 0 3 2 4 0 1 3 2 3 3]]
  (str "Contact Way:" (reduce str (map init order)))
;"Contact Way:18013820100"

其次大家如何使用LazySeq,例如reduce返回的不是LazySeq,map返回的是LazySeq。大家是否遇到因没有注意到是LazySeq而导致问题?

(let [init [8 2 1 0 3]
      order [2 0 3 2 4 0 1 3 2 3 3]]
  (str "Contact Way:" (map init order)))
;"Contact Way:clojure.lang.LazySeq@5338b775"
#2

(str "Contact Way:" (map init order)) 打印的是 Seq 本身, 不是里面的内容

#3

用过 doallprintln 等让 lazyseq 求值或运行 lazyseq 里包含的副作用。暂时还没实际使用过 realized? 来判断一个值是否已经被计算。我个人没在这方面遇到过什么问题。

题主例子里面的程序逻辑,也许可以用 replace 来表达:

(str "Contact Way:"
     (replace [8 2 1 0 3] [2 0 3 2 4 0 1 3 2 3 3]))

,结果是一样的,但丧失了惰性。

谢谢 :slight_smile:

#4

昨晚在微信群里一转, 然后 lo姐 扒源码去了… cljs 里倒是在 str 调用时做了转化, clj 里反而没有… 过程略复杂不能复述 >_<