17

ここに問題があります: 私は setf-expanders を「取得」しておらず、それらがどのように機能するかを学びたいと思っています。

setf-expanders を学ぶ必要がある理由の典型的な例のように見える問題があるため、それらがどのように機能するかを学ぶ必要があります。問題は次のとおりです。

(defparameter some-array (make-array 10))

(defun arr-index (index-string)
  (aref some-array (parse-integer index-string))

(setf (arr-index "2") 7) ;; Error: undefined function (setf arr-index)

ARR-INDEX 用の適切な setf-expander を作成するにはどうすればよいですか?

4

2 に答える 2

23
(defun (setf arr-index) (new-value index-string)
  (setf (aref some-array (parse-integer index-string))
        new-value))

Common Lisp では、関数名はシンボルであるだけでなくSETF、最初のシンボルとしての 2 つのシンボルのリストでもあります。上記を参照。DEFUNしたがって、SETF関数を定義できます。関数の名前は(setf arr-index).

setf 関数placeフォームで使用できます: CLHS: Other Compound Form as places

その場合、新しい値は最初の引数です。

CL-USER 15 > some-array
#(NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL)

CL-USER 16 > (setf (arr-index "2") 7)
7

CL-USER 17 > some-array
#(NIL NIL 7 NIL NIL NIL NIL NIL NIL NIL)
于 2012-07-12T18:51:14.843 に答える