Определение 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-expander для ARR-INDEX?

2 ответа

Решение
(defun (setf arr-index) (new-value index-string)
  (setf (aref some-array (parse-integer index-string))
        new-value))

В Common Lisp имя функции может быть не только символом, но и списком из двух символов с SETF как первый символ Смотри выше. DEFUN таким образом можно определить SETF функции. Название функции (setf arr-index),

Функция setf может использоваться в форме места: 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)

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

Другие вопросы по тегам