Определение setf-расширителей в Common Lisp

Вот что: я не "получаю" setf-расширители и хотел бы узнать, как они работают.

Мне нужно узнать, как они работают, потому что у меня есть проблема, которая кажется типичным примером того, почему вы должны изучать setf-расширения, проблема заключается в следующем:

(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)

Как написать правильный setf-расширитель для ARR-INDEX?

Ответ 1

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

В общем Lisp a CLHS: Другие составные формы как места.

Новое значение - это первый аргумент.

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)

Ответ 2

Ответ Райнера на месте. До ANSI Common Lisp необходимо было использовать defsetf для определения расширителя для простых мест, которые можно было бы установить простым вызовом функции. setf функции типа (setf arr-index) вошли в язык с CLOS и упростили много вещей. В частности, функции setf могут быть общими.