![]() |
1
14
简短回答:
长答案:
“流”通常是指某些元素序列,现在常用于有限字符序列的上下文中。这些字符序列通常来自文件、网络源或Unix管道。 如果一个序列的定义方式是它有无限多的元素,我们可以称之为无限序列。通常无限序列在内部表示为 linked list 最后,Clojure中“lazy sequence”的细微差别是指“按需”对数据结构进行顺序评估的模式。换句话说,这里的重点是 懒惰的 求值的性质;序列中某个特定元素的值直到您请求时才实际计算出来。 总之,在Clojure中,您应该使用以下词语:
|
![]() |
2
10
函数式的好处之一是能够将函数组合在一起。但是如果你看一看你写的函数,如果不依赖其他地方提供的功能,它们就不能单独发挥作用。
(defn stream-builder [f x] ; f is idiomatic for a function arg (lazy-seq ; n is idiomatic for a count, so use x instead (cons x (stream-builder f (f x)))))
上面的内容实际上会返回一个无穷多的值序列,因此我们需要拉出捆绑在里面的限制行为
(defn limit [n coll] ; coll is idiomatic for a collection arg (lazy-seq ; flipped order, fns that work on seqs usually take the seq last (when (pos? n) (when-let [s (seq coll)] (cons (first s) (limit (dec n) (next s)))))))
以上将
返回到
user=> (limit 5 (stream-builder inc 1)) (1 2 3 4 5) 最后,每个函数都能很好地完成一件事,并且可以与其他函数组合:
要解决此问题,请不要定义延迟序列,或使用限制来定义它,例如: (def odds (limit 23 (stream-builder #(+ 2 %) 1)))
为了将来的参考,我们刚刚编写的内容可以在core lib中作为
user=> (take 5 (iterate inc 1)) (1 2 3 4 5) |
![]() |
lightning_missile · 词法范围和共享对象 7 年前 |
![]() |
Alexandru Popa · SBCL中奇怪的宏扩展错误 7 年前 |
![]() |
Jacky · 编辑列表中的每个偶数索引元素 7 年前 |
![]() |
HappyFace · lisp典型缩进约定背后的规则是什么? 7 年前 |
![]() |
Jorge · 在公共Lisp中初始化计数器变量 7 年前 |
![]() |
Rorschach · cl循环破坏性修改cons单元 7 年前 |