Автор | Сообщение |
entrix
5 сообщений |
#4446 2011-06-12 22:02 GMT+3 часа(ов) |
Есть замыкание f, которое содержит свободную переменную y
(setq y 10) В среде clisp (в sbcl тоже самое) [7]> (funcall f 1) Т. е. меняя значение свободной переменной извне, оно изменяется и в замыкании. Вопрос я задал потому как в книге Мир лиспа (Хювенен, Сеппянен) замыкание квалифицировано как структура, запоминающая значения внешних переменных на момент определения. Здесь же получается, что замыкание таки сохраняет связь с внешним контекстом. Так что, значит за 20 лет эта специфика изменилась? |
|
ander-skirnir![]()
227 сообщений |
#4449 2011-06-13 04:10 GMT+3 часа(ов) |
Это просто в Мире Лиспа пример не очень корректный.
Написано там всё правильно, однако такой код не соответствует написанному, потому что в отрыве от контекста такой y - динамический биндинг, а не лексический. И суть замыканий как-раз в сохранении связи с контекстом. Вот как следовало написать этот пример: (let ((y 10)) |
|
ander-skirnir![]()
227 сообщений |
#4450 2011-06-13 04:21 GMT+3 часа(ов) |
А вот другой пример, чтобы лучше понять суть замыканий:
(let ((y 10)) |
|
entrix
5 сообщений |
#4451 2011-06-13 04:33 GMT+3 часа(ов) |
Ясно, свободная переменная всегда свободна.
А вот вопрос по коду: set-y определена внутри let, но вызывается в цикле, т.е. defun как макрос связывает функцию со значением символа всегда глобыльно? |
|
ander-skirnir![]()
227 сообщений |
#4452 2011-06-13 04:37 GMT+3 часа(ов) |
> свободная переменная всегда свободна.
Наблюдательное наблюдение ![]() > set-y определена внутри let, но вызывается в цикле, В каком цикле? > т.е. defun как макрос связывает функцию со значением символа всегда глобыльно? Да, но не со значением символа, а со значением его слота symbol-function. |
|
entrix
5 сообщений |
#4453 2011-06-13 04:41 GMT+3 часа(ов) |
В каком цикле? Я имел в виду repl ![]() Да, но не со значением символа, а со значением его слота symbol-function. Да, точно, с символом много чего связано, это же не схема ![]() |
|
megamanx
307 сообщений |
#4454 2011-06-13 12:17 GMT+3 часа(ов) |
(defvar y 10) Ещё, наверно, стоит помнить о *специальных* переменные, и о том, что порядок важен. (defvar *y* 10) |
|
I wish I'd made you angry earlier
|
|
misha![]()
1275 сообщений |
#4455 2011-06-13 14:04 GMT+3 часа(ов) |
> т.е. defun как макрос связывает функцию со значением символа всегда глобыльно?
> Да, точно, с символом много чего связано, это же не схема Символ сам является значением. Назовите хотя бы одну вменяемую реализацию схемы, в которой отсутствуют слоты? |
|
entrix
5 сообщений |
#4464 2011-06-13 18:57 GMT+3 часа(ов) |
megamanx: Вы очень кстати напомнили про динамическое связывание
misha: Я просто имел в виду тот факт, что в Схеме (я подразумевал R5RS ~ Guile) при помощи define и set! нет возможности связать с одним символом одновре- менно определение функции и конкретное значение. |
|