【问题标题】:Custom implementation of count for lazy seq惰性序列计数的自定义实现
【发布时间】:2014-10-14 14:16:58
【问题描述】:

在下面的示例代码中,我返回了一个惰性列表。当有人在列表上调用 count 时,我希望发生的事情是执行一些任意函数并返回我喜欢的任何函数。

(defn my-range [i limit]
  (lazy-seq 
   (when (< i limit)
     (cons i (my-range (inc i) limit)))))

(count (my-range 0 9)) returns whatever

我不确定这是否可行:我一直在查看reify,但不知道它是否可以在这种情况下使用。

【问题讨论】:

标签: clojure


【解决方案1】:

您可以这样做,但工作量很大:您必须自己实现所有与序列相关的接口,并将其中大部分委托给您的惰性序列。这是一个草图:

(defn my-range [i limit]
  (let [ret (lazy-seq 
              (when (< i limit)
                (cons i (my-range (inc i) limit))))]
    (reify
      clojure.lang.Counted
      (count [this] 10)
      clojure.lang.Sequential
      clojure.lang.ISeq
      (first [this] (.first ret))
      (next [this] (.next ret))
      (more [this] (.more ret))
      (cons [this x] (.cons ret x))
      (empty [this] (.empty ret))
      (equiv [this x] (.equiv ret x))
      (seq [this] (.seq ret)))))

确实,(my-range 1 3) 返回了一个声称计数为 10 的两项序列,这正是您想要的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-15
    • 1970-01-01
    • 2016-09-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多