次のコードをEmacsで評価すると、xの最終値として(2 3)が得られます。私は期待しています(1 2 3)。私は何が欠けていますか?Elisp:setqとソートの効果を把握できない
(setq x '(2 1 3))
(sort x '<)
x
次のコードをEmacsで評価すると、xの最終値として(2 3)が得られます。私は期待しています(1 2 3)。私は何が欠けていますか?Elisp:setqとソートの効果を把握できない
(setq x '(2 1 3))
(sort x '<)
x
をチェックし、あなたはそれ戻りソートされたリスト、および入力リストは、副作用によって修正であることがわかります。引数リストにソートされた結果が含まれているとは限りません。ソートアルゴリズムによって何らかの形で変更されます。または、すぐに言えば:sort
は、です。破壊的なです。
だから、あなたはsort
の戻り値を代入/バインドすることをお勧めします:
elisp> (setq x '(2 1 3))
(2 1 3)
elisp> (setq x (sort x '<))
(1 2 3)
elisp> x
(1 2 3)
私はelispの経験はあまりありませんが、carとcdrの実装のため正しく動作しています。あなたはsort
のマニュアルを読んでいる場合http://www.gnu.org/software/emacs/elisp/html_node/Rearrangement.html#Rearrangement
私は不明であったと思います。私は(最後のx)を意味するのではなく、xの最終的な値です。 –
私はレスポンスを編集しました。 –
また、リテラルを破壊的に変更すると、予想外の結果が生じる可能性があることに注意してください。 (例:http://stackoverflow.com/questions/6865142/lisp-cons-and-number-number-difference/6866155#6866155、CLについてはEmacs-Lispにも適用されます) – danlei