Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Clojure:查找集合是否可排序_Clojure_Clojureclr - Fatal编程技术网

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