2

こんにちは、単純な要素を Lisp リストに追加しようとしています。

(append queue1 (pop stack1))

上記のコードは、stack1 の最初の要素を queue1 に追加すると思いました。queue1非 nil である必要がありますか? ありがとう。

4

2 に答える 2

3

Appendは、連結されたリスト ( appendedの最初の要素を含む) を返します。queue1 は変更されません。queue1stack1

append の破壊的な同等物は nconc です: これはリストに「その場で」追加します。

于 2009-10-15T02:27:01.410 に答える
1

どの Lisp を意味するかは指定していませんが、少なくとも Common Lisp では次のようになります。

  1. APPEND はリストを連結するため、すべての引数はアトムではなくリストでなければなりません。本当にリストに要素を追加したい場合は、(append list1 (list element)). ほとんどの Lisp リストでは単一リンクであり、最後に追加するにはリスト全体をトラバースする必要があるため、これは良い考えではありません。通常、CONS を先頭に追加し、完了したらリストを逆にしますが、これはキューに対しては明らかに機能しません。

  2. APPEND は引数を変更しません。NCONC は破壊的な機能です。特に NCONC は多かれ少なかれ期待されることを行うように指定されていると思いますが、ほとんどの破壊的な関数は引数を破棄してメモリを再利用できますが、必ずしも一貫したものを残す必要はありません。

  3. Common Lisp のリストは、コンス セルまたは nil のチェーンとして実装されます。これは、それらの動作に、後者に関連する癖があることを意味します。他の言語に期待するようにリストを動作させたい場合は、リストの抽象データ構造を使用してください。最後に定数を追加するキューが必要な場合は、さらにそうです。cl-containersシステムには多くの命令型データ構造があり、 FSetには関数型データ構造があります。

于 2009-10-15T09:06:40.510 に答える