3

Practical Common Lispを読んでいます。第11章では、ソートについて次のように述べています。

通常、シーケンスをソートした後は、シーケンスのソートされていないバージョンを気にすることはないため、ソートの過程でシーケンスを許可SORTSTABLE-SORTて破棄することは理にかなっています。ただし、次のように書くことを忘れないでください。

(setf my-sequence (sort my-sequence #'string<))

次のコードを試しました:

CL-USER> (defparameter *a* #( 8 4 3 9 5 9 2 3 9 2 9 4 3)) 
*A*            
CL-USER> *a*
#(8 4 3 9 5 9 2 3 9 2 9 4 3)                                     
CL-USER> (sort *a* #'<)
#(2 2 3 3 3 4 4 5 8 9 9 9 9)
CL-USER> *a*
#(2 2 3 3 3 4 4 5 8 9 9 9 9)

*a*このコードでは、関数によって変数が変更されていることがわかりsortます。

では、なぜ本はそれが課題を行うために必要であると言っているのですか?

私はSBCL + Ubuntu 14.04 + Emacs + Slimeを使用しています

編集: @Sylwester のコメントに続いて*a*、値が変更されたことを明確にするための評価を追加します。

4

2 に答える 2

6

ソート関数は変数についてまったく認識していないため、ソート関数によって変数を変更することはできません。

sort 関数が取得するのはベクトルまたはリストだけですが、変数は取得できません。

Common Lisp では、sort 関数は破壊的である可能性があります。ソート用のベクトルを取得すると、同じベクトルまたは新しいベクトルを返すことができます。これは実装次第です。ある実装では同じベクトルを返す場合があり、別の実装では新しいベクトルを返す場合があります。しかし、いずれにせよ、それらはソートされます。

シーケンスを指す変数があり、作成者がソート後にソートされたシーケンスを指すことを期待している場合: 変数をソート操作の結果に設定します。そうしないと、潜在的に破壊的な並べ替えの後、変数が SORT の結果を指さず、並べ替えられていない、または変更されたシーケンスを指す場合があります。ベクトルの場合、これは古くてソートされていないベクトルである可能性があります。

覚え ておいてください: SORT 関数は、ソートされたシーケンスを値として返します。

于 2015-04-18T04:23:32.917 に答える