3

REMOVEは、Common Lisp の実際の実装で同じシーケンスを返すことがありますか? 仕様では、許可されていることが示唆されています。

remove の結果はシーケンスと共有される場合があります。要素を削除する必要がない場合、結果は入力シーケンスと同じになる可能性があります。

たとえば、SBCL はこれを行っていないようですが、私は大雑把な (そしておそらく不十分な) テストしか行っていません。

CL-USER> (defparameter *str* "bbb")
*力*
CL-USER> *str*
「ブッ」
CL-USER> (defparameter *str2* (#\a *str* を削除))
*STR2*
CL-USER> (eq *str* *str2*)
なし
CL-USER> *str*
「ブッ」
CL-USER> *str2*
「ブッ」
4

2 に答える 2

6

元の文字列を返すと便利です。文字列の要素が削除されない場合、元のシーケンスを返すと、新しいシーケンスの割り当てが防止されます。新しいシーケンスが内部的に割り当てられたとしても、この新しいシーケンスはすぐにガベージになる可能性があります。

たとえば、CLISP は元の文字列を返します。

[1]> (let ((a "abc")) (eq a (remove #\d a)))

T
于 2009-04-06T16:32:47.293 に答える
1

私はそれが主に実装に依存していると思います。一般的には、REMOVE が呼び出されたときに何かが削除されるのが典型的なケースであるため、それほど一般的ではないと思います。そのため、削除されていないケースに対してスペースの最適化を行うと、実行時のペナルティが発生し、必ずしもスペースを節約できるとは限りません。 、文字列と配列の戻り値にスペースを割り当てたいので、リストを作成するか、2パス操作を行う必要があるためです。

于 2009-04-06T15:05:05.820 に答える