4

setf関数呼び出しから返された配列参照で動作しない理由がわかりません。以下の例で、最後の呼び出しが失敗するのはなぜですか?

(setf arr #1a(a b c))

(defun ret-aref (a i)
    (aref a i))

(eql (ret-aref arr 0) (aref arr 0))

;succeeds
(progn
    (setf (aref arr 0) 'foo)
    arr)

;fails
(progn
    (setf (ret-aref arr 0) 'bar)
    arr)
4

1 に答える 1

9

演算子は実際にはsetfマクロであり、コンパイル時にプレースフォームを検査できる必要があります。それは について特別な知識を持っていarefますが、あなたの については何も知りませんret-aref

関数を認識させる最も簡単な方法は、適切な-function コンパニオンをsetf定義することです。setf例:

(defun (setf ret-aref) (new-value array index) 
   (setf (aref array index) new-value))

さて、(setf (ret-aref arr 0) 'bar)動作するはずです。

この単純な例は、setf-expansion が実際には非常に複雑なトピックであるという事実を隠しています。詳細は CLHS で確認できます。

于 2012-12-19T19:39:11.340 に答える