14

list?、seq?、vector?、map? があります。など、引数がどのタイプのコレクションであるかを判別します。

の違いを伝える良い方法は何ですか

  • マップ (つまり、キーと値のペアを含むもの)
  • コレクション (つまり、値を含むもの)
  • 文字列のような非コレクション値。

よりも良い方法はありますか

#(or (seq? %) (list? %) etc)
4

4 に答える 4

9

usingseq?は、可能な限り簡潔でクリーンです。

clojure.contrib.core は以下を定義します:

シーケンシャル?
    関数
    使用法: (seqable? x)
    (seq x) が成功する場合は true、そうでない場合は false を返します。

http://clojure.github.com/clojure-contrib/core-api.html

それはあなたが提案したことを1つの大きなor声明で行います

  • すでにシーケンス
  • clojure.lang.Seqable のインスタンス
  • なし
  • イテラブルのインスタンス
  • 配列
  • 文字列
  • java.util.Map のインスタンス
于 2010-10-25T22:07:03.007 に答える
5

忘れないようにしましょうsequential?

user=> (sequential? [])
true
user=> (sequential? '())
true
user=> (sequential? {:a 1})
false
user=> (sequential? "asdf")
false
于 2016-08-06T11:43:26.110 に答える
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());
    }
}

anASeqまたは aLazySeqはすでに seq です。ASeqableは、それ自体の seq を返す方法を知っているものです。

これにより、Java コア クラスのようなものが残ります。これらは、seqable である必要がありますが、Clojure が変更してseqメソッドを追加することはできません。それらは現在、このリストにハードコードされています。実装がいつか変更されても驚かないでしょうか。代わりにプロトコルを使用して Java コア クラスを拡張するのでしょうか?

于 2010-10-26T18:34:30.280 に答える
0

すべての seqable は clojure.lang.Seqable マーカーを実装しています:

(instance? clojure.lang.Seqable x)

Clojure 1.9 が提供するseqable?

于 2017-06-25T09:05:28.057 に答える