?

Log in

вопрос новичка - Жить не можем без проблем! [entries|archive|friends|userinfo]
Жить не можем без проблем!

[ userinfo | livejournal userinfo ]
[ archive | journal archive ]

вопрос новичка [Mar. 2nd, 2011|02:52 pm]
Жить не можем без проблем!
ru_lisp
[renoir1]
В чём принципиальное отличие операторов set, setq и setf?
Как я понял, set связывает имя и значение, setq связывает атом и значение, setf связывает ячейку памяти и значение. Не могли бы вы объяснить мне на каком-нибудь ярком примере разницу в работе и применении на практике этих операторов?
linkReply

Comments:
[User Picture]From: lispnik
2011-03-02 12:06 pm (UTC)
Главное отличие set от остальных — состоит в том, что он практически не нужен. :)

setq — специальная форма, которая присваивает значение переменной, а не атому. Атом может обозначать несколько переменных (например, две лексические переменные с одним именем во вложенных let).

setf — это макрос для обобщённого присваивание, для которого есть стандартный механизм расширения. Для переменных он просто прибегает к помощи setq. Кстати, попробуйте написать простенький вариант mysetf, пусть даже без механизма расширения, но который обрабатывал бы присваивания переменным, (car ...), (cdr ...), (gethash ...) и т.п. простые случаи ;)
(Reply) (Thread)
[User Picture]From: phoonzang
2011-03-02 12:10 pm (UTC)
(setq a 'b) = (set 'a 'b), если мне не изменяет память

setq = set quoted
(Reply) (Parent) (Thread)
[User Picture]From: love5an
2011-03-02 12:14 pm (UTC)
нет.
set это (setf symbol-value)

setq же работает и с лексическими переменными.
(Reply) (Parent) (Thread)
[User Picture]From: lispnik
2011-03-02 12:19 pm (UTC)
Это заблуждение, возникшее из-за лиспов с динамическим связыванием.

Эти формы эквивалентны, если a объявлена динамической переменной, в остальных случаях — нет.
(Reply) (Parent) (Thread)
[User Picture]From: phoonzang
2011-03-02 12:27 pm (UTC)
спасибо
(Reply) (Parent) (Thread)