> 1 <

Автор Сообщение

entrix

Members


Статус

5 сообщений

Где: Russia
Род занятий:
Возраст:

#4446   2011-06-12 22:02 GMT+3 часа(ов)      
Есть замыкание f, которое содержит свободную переменную y

(setq y 10)
(setq f (function (lambda (x) (+ x y))))

В среде clisp (в sbcl тоже самое)
[7]> (funcall f 1)
11
[8]> (setq y 2)
2
[9]> (funcall f 1)
3


Т. е. меняя значение свободной переменной извне, оно изменяется и в замыкании.
Вопрос я задал потому как в книге Мир лиспа (Хювенен, Сеппянен)
замыкание квалифицировано как структура, запоминающая значения внешних
переменных на момент определения. Здесь же получается, что замыкание
таки сохраняет связь с внешним контекстом. Так что, значит за 20 лет эта специфика изменилась?

ander-skirnir

Members


Статус

227 сообщений
http://lisper.ru
Где: Ukraine
Род занятий: `'`,`',`',
Возраст: 26

#4449   2011-06-13 04:10 GMT+3 часа(ов)      
Это просто в Мире Лиспа пример не очень корректный.
Написано там всё правильно, однако такой код не соответствует написанному,
потому что в отрыве от контекста такой y - динамический биндинг, а не лексический.

И суть замыканий как-раз в сохранении связи с контекстом.

Вот как следовало написать этот пример:
(let ((y 10))
(defvar f #'(lambda (x) (+ x y))))
 
> (funcall f 1)
=> 11
> (setq y 2)
=> 2
> (funcall f 1)
=> 11

ander-skirnir

Members


Статус

227 сообщений
http://lisper.ru
Где: Ukraine
Род занятий: `'`,`',`',
Возраст: 26

#4450   2011-06-13 04:21 GMT+3 часа(ов)      
А вот другой пример, чтобы лучше понять суть замыканий:
(let ((y 10))
(defvar f #'(lambda (x) (+ x y)))
(defun set-y (x) (setq y x)))
 
> (funcall f 1)
=> 11
> (setq y 2)
=> 2
> (funcall f 1)
=> 11
> (set-y 15)
=> 15
> (funcall f 1)
=> 16

entrix

Members


Статус

5 сообщений

Где: Russia
Род занятий:
Возраст:

#4451   2011-06-13 04:33 GMT+3 часа(ов)      
Ясно, свободная переменная всегда свободна.

А вот вопрос по коду: set-y определена внутри let, но вызывается в цикле,
т.е. defun как макрос связывает функцию со значением символа всегда глобыльно?

ander-skirnir

Members


Статус

227 сообщений
http://lisper.ru
Где: Ukraine
Род занятий: `'`,`',`',
Возраст: 26

#4452   2011-06-13 04:37 GMT+3 часа(ов)      
> свободная переменная всегда свободна.
Наблюдательное наблюдение

> set-y определена внутри let, но вызывается в цикле,
В каком цикле?

> т.е. defun как макрос связывает функцию со значением символа всегда глобыльно?
Да, но не со значением символа, а со значением его слота symbol-function.

entrix

Members


Статус

5 сообщений

Где: Russia
Род занятий:
Возраст:

#4453   2011-06-13 04:41 GMT+3 часа(ов)      
В каком цикле?



Я имел в виду repl

Да, но не со значением символа, а со значением его слота symbol-function.



Да, точно, с символом много чего связано, это же не схема

megamanx

Members


Статус

307 сообщений

Где: Russia
Род занятий:
Возраст:

#4454   2011-06-13 12:17 GMT+3 часа(ов)      
(defvar y 10)
=> Y
(let ((y 10))
(defvar f #'(lambda (x) (+ x y))))
=> SET-Y
(funcall f 1)
=> 11
(setq y 2)
=> 2
(funcall f 1)
=> 3
(set-y 10)
=> 10
(funcall f 1)
=> 11

Ещё, наверно, стоит помнить о *специальных* переменные, и о том, что порядок важен.
(defvar *y* 10)
=> *Y*
(let ((*y* 10))
(defvar f #'(lambda (x) (+ x *y*))))
=> SET-Y
(funcall f 1)
=> 11
(setq *y* 2)
=> 2
(funcall f 1)
=> 11
(set-y 2)
=> 2
(funcall f 1)
=> 11
*Y*
=> 2
I wish I'd made you angry earlier

misha

Moderators


Статус

1273 сообщений
http://racket-lang.org/
Где: Yemen
Род занятий:
Возраст:

#4455   2011-06-13 14:04 GMT+3 часа(ов)      
> т.е. defun как макрос связывает функцию со значением символа всегда глобыльно?
> Да, точно, с символом много чего связано, это же не схема

Символ сам является значением. Назовите хотя бы одну вменяемую реализацию схемы, в которой отсутствуют слоты?

entrix

Members


Статус

5 сообщений

Где: Russia
Род занятий:
Возраст:

#4464   2011-06-13 18:57 GMT+3 часа(ов)      
megamanx: Вы очень кстати напомнили про динамическое связывание

misha: Я просто имел в виду тот факт, что в Схеме (я подразумевал R5RS ~ Guile)
при помощи define и set! нет возможности связать с одним символом одновре-
менно определение функции и конкретное значение.
> 1 <


Онлайн :

0 пользователь(ей), 12 гость(ей) :




Реклама на сайте: