Это должно быть (setf letterSearchOn (char string1 i))
.
Способ работы (setf)
в Common Lisp действительно классный;это макрос, но используемый макроэкспандер зависит от аргумента.Например:
(defparameter a (list 1))
(setf (car a) 2)
a ; => (2)
(setf (cdr a) (list 3))
a ; => (2 3)
Это кажется странным?(car a)
- это функция ... как вы можете "установить" ее на новое значение ???Ответ заключается в том, что если первый аргумент (setf)
является списком, начинающимся с car
, он расширяется до кода, который устанавливает car
в ячейке cons.Если первый аргумент является списком, который начинается с cdr
, он расширяется до кода, который устанавливает cdr
в ячейке cons.И так далее для векторов, хеш-таблиц и т. Д. И т. Д.
Вы даже можете определить свои собственные (setf)
макросы, которые могут расширить диапазон вещей, которые (setf)
знает, как установить.В этом случае вы передаете (letterSearchOn (char string1 i))
, поэтому он думает, что вы хотите использовать специальный макроэкспандер letterSearchOn
, но такой макроэкспандер setf
не определен.