[CL] defun и setf
Первые сто страниц ANSI Common Lisp наивно полагал, что setf — это присваивание какому-то символу вычисленного второго аргумента, а defun — это просто специализированная обертка вокруг setf для создания функций. Т.е. ассоциирование с символом какого-то кода. Но на сотой странице Грэм производит пробный взрез мозга:
By making the first argument to defun a list of the form (setf f), you define what happens when the first argument to setf is a call to f. The following pair of functions defines primo as a synonym for car:
In the definition of a function whose name is of the form (setf f), the first parameter represents the new value, and the remaining parameters represent arguments to f. Now any setf of primo will be a call to the latter function above:(defun primo (1st ) (car 1st)) (defun (setf primo) (val 1st) (setf (car 1st) val))
> (let ((x (list 'a 'b 'c))) (setf (primo x) 480) x) (480 B C)
На ум приходит только operator= и что-то вроде operator* из C++. Но зачем это нужно? Ведь в (setf (primo x) 480), где primo равнозначно car, car и вернет ссылку, которой можно присвоить. Что Я Думаю Не Так?