Mar 02, 2011 14:52
В чём принципиальное отличие операторов set, setq и setf?
Как я понял, set связывает имя и значение, setq связывает атом и значение, setf связывает ячейку памяти и значение. Не могли бы вы объяснить мне на каком-нибудь ярком примере разницу в работе и применении на практике этих операторов?
Leave a comment
Comments 13
[1]> (setq x 'y)
Y
[2]> (set x '(a b))
(A B)
[3]> (setf (car y) 'c)
C
[4]> x
Y
[5]> y
(C B)
... Программистов не выпускать! ...
Reply
Reply
... Отдел по борьбе с организованной реальностью ...
Reply
Reply
setq - специальная форма, которая присваивает значение переменной, а не атому. Атом может обозначать несколько переменных (например, две лексические переменные с одним именем во вложенных let).
setf - это макрос для обобщённого присваивание, для которого есть стандартный механизм расширения. Для переменных он просто прибегает к помощи setq. Кстати, попробуйте написать простенький вариант mysetf, пусть даже без механизма расширения, но который обрабатывал бы присваивания переменным, (car ...), (cdr ...), (gethash ...) и т.п. простые случаи ;)
Reply
(The comment has been removed)
set это (setf symbol-value)
setq же работает и с лексическими переменными.
Reply
Эти формы эквивалентны, если a объявлена динамической переменной, в остальных случаях - нет.
Reply
Reply
(defun fn (x &optional y &rest x)
(list (x y z)))
Почему-то не работает в среде CLISP... Ввожу значения (fn 'a 'b), ругается "Где z?"
Почему не работает?
Reply
Reply
Reply
Leave a comment