вопрос новичка

Mar 02, 2011 14:52

В чём принципиальное отличие операторов set, setq и setf?
Как я понял, set связывает имя и значение, setq связывает атом и значение, setf связывает ячейку памяти и значение. Не могли бы вы объяснить мне на каком-нибудь ярком примере разницу в работе и применении на практике этих операторов?

Leave a comment

Comments 13

slobin March 2 2011, 12:06:09 UTC

[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

bajaz March 2 2011, 17:16:53 UTC
Видимо, в [2] подразумевался Y.

Reply

slobin March 2 2011, 17:30:15 UTC
Не-а! Значением переменной X является символ Y, и в [2] set присваивает список именно в переменную, имя которой лежит в X, то есть в Y. Такая косвенная адресация. Как справедливо заметили ниже, в *динамическую* переменную Y -- фича унаследована из старых динамических лиспов. В современном коммон лиспе в реальных программах подавляющее большинство переменных -- лексические, до них так не доберёшься. А вообще это копипаста реальной сессии, там неоткуда чему-то "подразумеваться". ;-)

... Отдел по борьбе с организованной реальностью ...

Reply

bajaz March 2 2011, 18:29:15 UTC
А, дошло. Нормальная фича, экономит symbol-value. А называется так основательно, типа, потому что оба аргумента вычисляются. ^_^ А циферки в квадратных скобках тоже копипащенные?

Reply


lispnik March 2 2011, 12:06:54 UTC
Главное отличие set от остальных - состоит в том, что он практически не нужен. :)

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

setf - это макрос для обобщённого присваивание, для которого есть стандартный механизм расширения. Для переменных он просто прибегает к помощи setq. Кстати, попробуйте написать простенький вариант mysetf, пусть даже без механизма расширения, но который обрабатывал бы присваивания переменным, (car ...), (cdr ...), (gethash ...) и т.п. простые случаи ;)

Reply

(The comment has been removed)

love5an March 2 2011, 12:14:12 UTC
нет.
set это (setf symbol-value)

setq же работает и с лексическими переменными.

Reply

lispnik March 2 2011, 12:19:20 UTC
Это заблуждение, возникшее из-за лиспов с динамическим связыванием.

Эти формы эквивалентны, если a объявлена динамической переменной, в остальных случаях - нет.

Reply


renoir1 March 3 2011, 09:38:44 UTC
Спасибо большое! Особенно за первый пример.

Reply


Если можно, ещё вопрос. renoir1 March 7 2011, 08:40:20 UTC
Пример из книжки "Мир лиспа" т.1.

(defun fn (x &optional y &rest x)
(list (x y z)))

Почему-то не работает в среде CLISP... Ввожу значения (fn 'a 'b), ругается "Где z?"
Почему не работает?

Reply

Re: Если можно, ещё вопрос. renoir1 March 7 2011, 08:58:29 UTC
В принципе, если заменить '&rest x` на '&rest z` то работает, однако в книжке чорным по белому написан первый вариант.

Reply

Re: Если можно, ещё вопрос. brazhe April 19 2011, 06:28:35 UTC
В книжках бывают опечатки же

Reply


Leave a comment

Up