Определение 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
функции могут быть общими.