所以有列表?,seq?,vector ?, map?等等,以确定论证的收集类型。
什么是区分
的好方法有没有比
更好的方法#(or (seq? %) (list? %) etc)
答案 0 :(得分:9)
seq?
的 简洁明了。
clojure.contrib.core定义:
seqable? function Usage: (seqable? x) Returns true if (seq x) will succeed, false otherwise.
http://clojure.github.com/clojure-contrib/core-api.html
它使用
的一个大or
语句执行您的建议
答案 1 :(得分:4)
现在,函数seq
仅执行此操作:
(. clojure.lang.RT (seq coll))
在最新版Clojure的RT.java
中,你会发现:
static public ISeq seq(Object coll){
if(coll instanceof ASeq)
return (ASeq) coll;
else if(coll instanceof LazySeq)
return ((LazySeq) coll).seq();
else
return seqFrom(coll);
}
static ISeq seqFrom(Object coll){
if(coll instanceof Seqable)
return ((Seqable) coll).seq();
else if(coll == null)
return null;
else if(coll instanceof Iterable)
return IteratorSeq.create(((Iterable) coll).iterator());
else if(coll.getClass().isArray())
return ArraySeq.createFromObject(coll);
else if(coll instanceof CharSequence)
return StringSeq.create((CharSequence) coll);
else if(coll instanceof Map)
return seq(((Map) coll).entrySet());
else {
Class c = coll.getClass();
Class sc = c.getSuperclass();
throw new IllegalArgumentException("Don't know how to create ISeq from: " + c.getName());
}
}
ASeq
或LazySeq
已经是seq。 Seqable
是知道如何返回自身序列的东西。
这样就留下了Java核心类,它们应该是可选的,但是Clojure不能改变它来添加seq
方法。这些目前已被硬编码到此列表中。如果有一天实现改变了,可能会使用协议来扩展Java核心类,我不会感到惊讶吗?
答案 2 :(得分:4)
我们不要忘记sequential?
:
user=> (sequential? [])
true
user=> (sequential? '())
true
user=> (sequential? {:a 1})
false
user=> (sequential? "asdf")
false
答案 3 :(得分:0)