3

pop関数のドキュメントには、次のように書かれています。

user> (doc pop)
-------------------------
clojure.core/pop
([coll])
  For a list or queue, returns a new list/queue without the first
  item, for a vector, returns a new vector without the last item. If
  the collection is empty, throws an exception.

ただし、例外をスローする必要がある動作を再現できないようです。

たとえば、ここでは 3 つの要素をキューに追加してからpop5 回追加します。ドキュメントによると、これは機能しないはずです。ただし、例外が発生する代わりに、nil が発生します。

(peek (pop (pop (pop (pop (pop (conj (conj (conj clojure.lang.PersistentQueue/EMPTY 4) 5) 6)))))))

空のキューから行おうとしたときに例外をスローする代わりに、空のキューが返されることをとても気に入っていpopますが、動作がドキュメントと異なる理由を理解したいと思います(少なくともドキュメントを読んで理解したものから)。 .

pop基本的に、ここで例外から自分自身を「保護」する必要があるかどうか、または「空のキューを実行すると常に空のキューが返される」と安全に想定できるかどうかを知りたいです(これはドキュメントと矛盾します)。

4

1 に答える 1

1

おっしゃるとおり、doc 文字列に矛盾があるようです。現在、空のキューをポップすると、空のキューが生成されます。PersistentQueue のソースのコメントから判断すると、コア開発者は望ましい動作について議論していたようです。

public PersistentQueue pop(){
    if(f == null) //hmmm... pop of empty queue -> empty queue?
        return this;
    //throw new IllegalStateException("popping empty queue");
    ISeq f1 = f.next();
    PersistentVector r1 = r;
    if(f1 == null)
        {
        f1 = RT.seq(r);
        r1 = null;
        }
    return new PersistentQueue(meta(), cnt - 1, f1, r1);
}

この動作が将来変更されることはないと仮定すると、私は自分自身を安全だとは考えません。

于 2013-03-21T01:35:17.173 に答える