Здравствуйте, Beam, Вы писали:
ie>>замыкание ::= (лямбда + ссылки на свободные переменные) — так пойдет ?
B>Что такое ссылки на свободные переменные? Если имеется ввиду ссылки на переменные, определенные во внешнем контексте, то да, согласен.
Да, именно это с самого твоего первого поста и имелось ввиду.
B>>>Скорее, замыкание имеет привязанные к контексту ссылки (в противопоставление лямбде, где ссылки тоже есть, но они не привязаны).
ie>>Не согласен. См. ниже
B>Может я не понят. Я имею ввиду, что в лямбде описаны свободные переменные (внешние), но их значения не определены. А вот в замыкания они имеют конкретные значения/ссылки, т.е. привязаны к контексту.
Еще раз, как только в функции определены свободные переменные, она есть замыкание! Не может быть свободных переменных используемых в функции, если те не определены во внешнем контексте. Или я чего-то не знаю?
ie>>Вот на этом примере давай остановимся. У тебя
ie>>ie>>lambda(x) (x + n)
ie>>
ie>>является лямбдой, но не является замыканием. Почему?
B>Не является замыканием, потому что не имеет ни одной переменной, привязанной к внешнему контексту. Его вообще здесь нет
Угу, а что в таком случае n? Разве не свободная переменная? Безусловно, я этого явно не указал, но полагаю, что где-то во внешнем контексте она определена. Да и вообще у меня в голове не укладывается, что n может быть совсем нигде не определена. Ну тупо не скомпилиться/сыньтерпритируется код.
B>>>Будет ли полученная функция замыканием, если не будут привязаны к контексту все свободные переменные.
B>>>B>>>define makeFunc(n) (
B>>> lambda(x) (x + n + k) // n, k - свободные (***)
B>>>)
B>>>// в лямбде свяжем переменную n со значением 1
B>>>func := makeFunc(1) (+++)
B>>>// получили такую функцию:
B>>>define func(x) (x + 1 + k)
B>>>
B>>>Как видно, мы получили другую лямбду. Но является ли это замыканием? Я думаю, да, т.к. связывание с контекстом все таки было.
ie>>Является, только замыкание у нас опять появилось в (***), а не в (+++).
B>Не спорю, замыкание появилось в (***). Именно там была создана новая функция. В (+++) всего лишь присваивание. См. чуть ниже
Создана новая функция.... Хмм... А при чем тут создана? Объявлена функция с ссылкой на свободные переменные.
ie>>Еще раз повторю: замыкание ссылается на свободные переменные, а не на значения.
B>И с этим я не спорю. Просто в примерах используются значения.
В примерах используются переменные. Я там значений не увидел.
B>>>Будет ли полученная функция замыканием, если будет присвоено конкретное значение параметрам функции:
B>>>B>>>define makeFunc(x) (
B>>> lambda(x, y) (x + y)
B>>>)
B>>>// в лямбде свяжем переменную x со значением 1
B>>>func := makeFunc(1)
B>>>// получили такую функцию:
B>>>define func(y) (1 + y)
B>>>
ie>>Я выделил замыкание.
B>Не понял. Похоже ты называешь замыканием описание лямбды, расположенной в каком либо контексте, а я — называю замыканием конкретную функцию, которая существует в программе (ну как объект) и создается динамически. Я понятно разницу объяснил?
Да, я считаю замыканием не экземпляр функции, а саму функцию, т.е. ее декларацию. А когда я работаю с функцией, которую мне вернули, то меня мало беспокоит замыкание это или нет.
P.S. А вообще тут уже правильно заметили, все определения есть в википедии. Насколько они формальны чудить не мне, но общую картину они дают, а чего же более желать.
... << RSDN@Home 1.2.0 alpha rev. 0>>