2

add-to-list は、要素がリストにない場合に要素をリストに追加するためによく使用されます。

(let* ((aa (list 1 2 3))
       (bb aa))
  (add-to-list 'aa 0)
  (list :aa aa :bb bb))

=> (:aa (0 1 2 3) :bb (1 2 3))

名前 aa の意味を変更するため、add-to-front を破壊関数と呼ぶべきでしょうか? それとも、 aa が指していたリストが無傷であるため、非破壊的と呼ぶべきですか?

(let* ((cc (list 1 2 3))
       (dd cc))
  (add-to-list 'cc 0 t)
  (list :cc cc :dd dd))

=> (:cc (1 2 3 0) :dd (1 2 3))

bb と dd が (1 2 3) に等しい理由を疑問に思っている Emacs の初心者の方は、別のスタック オーバーフローの質問を開いて、「コメントを追加」ボタンでリンクを残してください。Emacs の初心者で、仲間の初心者がなぜそれを疑問に思うのか疑問に思っている場合は、(add-to-list 'aa 0) を (setcar aa 111) に置き換えて見てください。

Emacs を使用しない Lispers 向けに、add-to-list の簡単な定義を次に示します。

(defun simple-add-to-list (list-var element &optional append)
  "Add ELEMENT to the value of LIST-VAR if it isn't there yet.
If ELEMENT is added, it is added at the beginning of the list,
unless the optional argument APPEND is non-nil, in which case
ELEMENT is added at the end.
The return value is the new value of LIST-VAR."
  (let ((lst (symbol-value list-var)))
    (if (member element lst)
        lst
      (set list-var
           (if append
               (append lst (list element))
             (cons element lst))))))
4

1 に答える 1

2

渡されたリストを変更できる場合、それは破壊的です。

関数がシンボルを介してリストを取る場合、それは自動的に破壊的であると見なされるべきですよね? それ以外の場合は、リスト自体を取得しないのはなぜですか?

于 2013-05-27T09:32:01.523 に答える