Clojure:查找集合是否可排序
这里有列表?,序列?,向量?,地图?依此类推,以确定参数是什么类型的集合 区分两者的好方法是什么Clojure:查找集合是否可排序,clojure,clojureclr,Clojure,Clojureclr,这里有列表?,序列?,向量?,地图?依此类推,以确定参数是什么类型的集合 区分两者的好方法是什么 映射(即包含键值对的内容) 集合(即包含值的东西) 类似字符串的非集合值 还有比这更好的方法吗 #(or (seq? %) (list? %) etc) 使用seq?尽可能简洁、干净 clojure.contrib.core定义: seqable? function Usage: (seqable? x) Returns true if (seq x) will suc
- 映射(即包含键值对的内容)
- 集合(即包含值的东西)
- 类似字符串的非集合值李>
#(or (seq? %) (list? %) etc)
使用seq?
尽可能简洁、干净
clojure.contrib.core定义:
seqable?
function
Usage: (seqable? x)
Returns true if (seq x) will succeed, false otherwise.
seqable?
功能
用法:(表?x)
如果(seq x)将成功,则返回true,否则返回false。
它通过一个大的或声明实现了您的建议
- 已经有一个seq了
- clojure.lang.Seqable的一个实例
- 零
- Iterable实例
- 阵列
- 一串
- java.util.Map的实例
现在的功能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
是知道如何返回自己的seq的东西
这就留下了Java核心类之类的东西,这些类应该是可排序的,但Clojure不能修改它们来添加seq
方法。这些是目前硬编码到该列表中的。如果有一天实现发生了变化,我也不会感到惊讶,也许会使用协议来扩展Java核心类?让我们不要忘记:
所有Seqable都实现clojure.lang.Seqable标记:
(实例?clojure.lang.Seqable x)
Clojure 1.9在Clojure(1.5)的当前版本中提供了?目前住在clojure.core.incubator(repo@)
user=> (sequential? [])
true
user=> (sequential? '())
true
user=> (sequential? {:a 1})
false
user=> (sequential? "asdf")
false