2009-04-06 6 views
3

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

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

SBCLはこれを行うようには見えませんが、私は粗悪な(そしておそらくは不十分な)テストしか行っていませんでした。

 
CL-USER> (defparameter *str* "bbb") 
*STR* 
CL-USER> *str* 
"bbb" 
CL-USER> (defparameter *str2* (remove #\a *str*)) 
*STR2* 
CL-USER> (eq *str* *str2*) 
NIL 
CL-USER> *str* 
"bbb" 
CL-USER> *str2* 
"bbb" 

答えて

6

元の文字列を返すと便利です。文字列の要素が削除されない場合、元のシーケンスを返すことで新しいシーケンスの割り当てができなくなります。たとえ新しいシーケンスが内部的に割り当てられたとしても、この新しいシーケンスはできるだけ早くゴミに変えることができます。

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

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

T 
1

私は主に実装に依存していると考えます。全体的には、REMOVEが呼び出されたときに何かが削除されるという典型的なケースがあるので、何も削除されていないケースのスペース最適化を実行すると実行時のペナルティが発生し、なぜなら、文字列と配列の戻り値のためのスペースを割り当てる必要があり、行くときにリストを構築するか、2パス操作を行う必要があるからです。

関連する問題