?

Log in

No account? Create an account
вопрос новичка - Жить не можем без проблем! [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: slobin
2011-03-02 12:06 pm (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) (Thread)
[User Picture]From: bajaz
2011-03-02 05:16 pm (UTC)
Видимо, в [2] подразумевался Y.
(Reply) (Parent) (Thread)
[User Picture]From: slobin
2011-03-02 05:30 pm (UTC)
Не-а! Значением переменной X является символ Y, и в [2] set присваивает список именно в переменную, имя которой лежит в X, то есть в Y. Такая косвенная адресация. Как справедливо заметили ниже, в *динамическую* переменную Y -- фича унаследована из старых динамических лиспов. В современном коммон лиспе в реальных программах подавляющее большинство переменных -- лексические, до них так не доберёшься. А вообще это копипаста реальной сессии, там неоткуда чему-то "подразумеваться". ;-)

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

(Reply) (Parent) (Thread)
[User Picture]From: bajaz
2011-03-02 06:29 pm (UTC)
А, дошло. Нормальная фича, экономит symbol-value. А называется так основательно, типа, потому что оба аргумента вычисляются. ^_^ А циферки в квадратных скобках тоже копипащенные?
(Reply) (Parent) (Thread)
[User Picture]From: slobin
2011-03-02 10:42 pm (UTC)
Да. Это сессия разговора с CLISP'ом, его подсказки. Он у меня на всякий случай стоит, реально я на коммон лиспе ничего не разрабатываю.

... Настойчивость, усидчивость и прилежание ...

(Reply) (Parent) (Thread)
[User Picture]From: bajaz
2011-03-02 10:46 pm (UTC)
Лисп сцуко коварный, можно "реально" и не разрабатывать, а он всё равно где-то там. %)
(Reply) (Parent) (Thread)
[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)
From: renoir1
2011-03-03 09:38 am (UTC)
Спасибо большое! Особенно за первый пример.
(Reply) (Thread)
From: renoir1
2011-03-07 08:40 am (UTC)

Если можно, ещё вопрос.

Пример из книжки "Мир лиспа" т.1.

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

Почему-то не работает в среде CLISP... Ввожу значения (fn 'a 'b), ругается "Где z?"
Почему не работает?
(Reply) (Thread)
From: renoir1
2011-03-07 08:58 am (UTC)

Re: Если можно, ещё вопрос.

В принципе, если заменить '&rest x` на '&rest z` то работает, однако в книжке чорным по белому написан первый вариант.
(Reply) (Parent) (Thread)
[User Picture]From: brazhe
2011-04-19 06:28 am (UTC)

Re: Если можно, ещё вопрос.

В книжках бывают опечатки же
(Reply) (Parent) (Thread)