2009-07-23 53 views

回答

9

如果要测试集合的“其余”是否为空,请使用next

user> (next '(foo bar)) 
(bar) 
user> (next '()) 
nil 
user> (doc next) 
------------------------- 
clojure.core/next 
([coll]) 
    Returns a seq of the items after the first. Calls seq on its 
    argument. If there are no more items, returns nil. 

“未缴双关语”(治疗空集合/序列和nil为同样的事情)去年辗转赞成完全懒序列。有关导致此更改的讨论,请参阅here

+0

当我编写cond子句重复序列时,我的第一个检查通常是(空?obj)。这是在Clojure中重现的正确方法吗? – unj2 2009-07-24 01:54:24

1

还学习Clojure。

对于空的sequencesrest返回seq返回nil的顺序。

这就是为什么你会得到这种行为。

我认为这是简化的序列进行递归,直到它们是空的,而且很可能其他聪明的家伙原因...

4

firstrest是适用于逻辑结构(seq)的功能,而不是链接一个列表的结构(如在其他语言中)。

Clojure根据序列(seqs)定义了许多算法。 seq是一个逻辑列表,并且不同于大多数Lisp,其中列表由具体的2插槽结构表示,Clojure使用ISeq接口允许许多数据结构提供对其元素作为序列的访问。

http://clojure.org/sequences

的行为是所述函数的定义,而不是由数据的原始结构确定的结果。

0

从技术上说虽然没有一个有用的方式。

“通过调用创建的序列(seq'())是否具有无限数量的空值?”
答案是肯定的becase的的(其余的)空序列是坎空序列它的自我可以有一个(休息)

这种输出的方式误导:

 
1:7 user=> (rest '()) 
() 

第一个'()在这里是空列表
secong()在这里是空序列
序列与repl中的列表一样打印,即使它们不相同。

2

没有 - 空列表是不一样的尼尔斯

这是比较容易证明的无限序列。假设我们有:

(def infinite-nils (repeat nil)) ; an infinite lazy sequence of nils 
(def empty-list '())   ; an empty list 

他们有不同数量的元素:

(count infinite-nils) => doesn't terminate 
(count empty-list) => 0 

以从中:

(take 10 infinite-nils) => (nil nil nil nil nil nil nil nil nil nil) 
(take 10 empty-list)  =>() 

如果你调用序列上他们,你得到

(seq inifinite-nils) => sequence of infinite nils 
(seq empty-list)  => nil 

在原来的混乱可以largel Ÿ通过了解以下事实来解决:

  • “()是一家集(持久列表),而不是一个序列。但它是顺序的,所以你可以拨打seq将其转换为顺序。
  • 零是空序列 - 所以因此(seq '())返回nil,象(seq (rest '()))
  • first返回nil上一个空序列 - 因此为什么(first (rest '()))为零。
相关问题