Использование синтаксиса Setf в цикле - PullRequest
1 голос
/ 13 февраля 2012

Как правильно сделать setf для переменной ниже?

CG-USER(279): (defun LETTERSEARCH (string1 string2) 
  (let ((newString nil))
  (let ((letterSearchOn nil))
  (loop for i from 0 below (length string1)
      always
          (setf (letterSearchOn (char string1 i))           
          (print letterSearchOn))))))
LETTERSEARCH
CG-USER(280): (stringprod "abc" "abc")

NIL 
Error: `(SETF LETTERSEARCHON)' is not fbound
[condition type: UNDEFINED-FUNCTION]
CG-USER(281): 

1 Ответ

5 голосов
/ 13 февраля 2012

Это должно быть (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 не определен.

...