Про замыкания
От: Щъмых Марс  
Дата: 19.08.12 08:19
Оценка:
Замыкание (англ. closure) в программировании — процедура или функция, в теле которой присутствуют ссылки на переменные, объявленные вне тела этой функции и не в качестве её параметров (а в окружающем коде).

Должно ли оно обязательно быть лямбда выражением, то анонимной функцией (методом), вложенной в другую? А если вот так:


class MyClass{
  
 int var1;
 void method1(){
  // работаем с var1
 }


}


Это замыкание?
Re: Про замыкания
От: BlackEric http://black-eric.lj.ru
Дата: 19.08.12 08:26
Оценка:
Здравствуйте, Щъмых, Вы писали:

Щ>Замыкание (англ. closure) в программировании — процедура или функция, в теле которой присутствуют ссылки на переменные, объявленные вне тела этой функции и не в качестве её параметров (а в окружающем коде).


Щ>Должно ли оно обязательно быть лямбда выражением, то анонимной функцией (методом), вложенной в другую? А если вот так:



Щ>
Щ>class MyClass{
  
Щ> int var1;
Щ> void method1(){
Щ>  // работаем с var1
Щ> }


Щ>}
Щ>


Щ>Это замыкание?

Это использование переменных класса в функции. И ничего больше.
А иначе весь гнилой код — одно сплошное замыкание.
https://github.com/BlackEric001
Re: Про замыкания
От: Курилка Россия http://kirya.narod.ru/
Дата: 19.08.12 08:53
Оценка: +1
Здравствуйте, Щъмых, Вы писали:

Щ>Замыкание (англ. closure) в программировании — процедура или функция, в теле которой присутствуют ссылки на переменные, объявленные вне тела этой функции и не в качестве её параметров (а в окружающем коде).

Щ>Должно ли оно обязательно быть лямбда выражением, то анонимной функцией (методом), вложенной в другую? А если вот так:

[cut]

Щ>Это замыкание?


По этому поводу есть выражение:

Closures are poor man's objects and vice versa.

Например, тут
Re: Про замыкания
От: MOByte  
Дата: 19.08.12 11:17
Оценка:
Здравствуйте, Щъмых, Вы писали:

Щ>Замыкание (англ. closure) в программировании — процедура или функция, в теле которой присутствуют ссылки на переменные, объявленные вне тела этой функции и не в качестве её параметров (а в окружающем коде).


Щ>Должно ли оно обязательно быть лямбда выражением, то анонимной функцией (методом), вложенной в другую?


Что-то много про это замыкание разговоров с ссылками на определение.

"Замыкание" это "фиксирование" свободных переменных функцией при ее создании, т.н. захват (замыкание) функцией своего "лексического окружения". Лексическое окружение (lexical scope) — это набор доступных лексических переменных. У каждой созданной функции есть свое (возможно пустое) захваченное "лексическое окружение".

Благодаря такой возможности можно создавать функции с одним кодом, но с разным поведением.

Например,

(defn gen-greeting [greeting]
  (fn [name]
      (print greeting ", " name)


Здесь в качестве результата выполнения функции gen-greeting будет анонимная функция

(fn [name]
  (print greeting ", " name)


Для нее переменная greeting является свободной переменной и при создании будет "захвачено" в лексическое окружение. Вот этот процесс и называется "замыканием".

Например, создадим две разных функций приветствия:

(def hello-greeting (gen-greeting "Hello"))
(def morning-greeting (gen-greeting "Good morning"))


Проверяем:

(hello-greeting "Щъмых")
-> Hello, Щъмых

(morning-greeting "Щъмых")
-> Good morning


Видим, что переменная greeting для каждой из функций содержит разные значения.

Проверяем:

(hello-greeting "Щъмых")
-> Hello, Щъмых

(morning-greeting "Щъмых")
-> Good morning
Re[2]: Про замыкания
От: Щъмых Марс  
Дата: 19.08.12 11:23
Оценка:
Здравствуйте, BlackEric, Вы писали:

BE>Здравствуйте, Щъмых, Вы писали:


Щ>>Замыкание (англ. closure) в программировании — процедура или функция, в теле которой присутствуют ссылки на переменные, объявленные вне тела этой функции и не в качестве её параметров (а в окружающем коде).


Щ>>Должно ли оно обязательно быть лямбда выражением, то анонимной функцией (методом), вложенной в другую? А если вот так:



Щ>>
Щ>>class MyClass{
  
Щ>> int var1;
Щ>> void method1(){
Щ>>  // работаем с var1
Щ>> }


Щ>>}
Щ>>


Щ>>Это замыкание?

BE>Это использование переменных класса в функции. И ничего больше.
BE>А иначе весь гнилой код — одно сплошное замыкание.
Согласно определению, ты неправ.
Re[2]: Про замыкания
От: Щъмых Марс  
Дата: 19.08.12 11:24
Оценка:
Здравствуйте, Курилка, Вы писали:

К>Здравствуйте, Щъмых, Вы писали:


Щ>>Замыкание (англ. closure) в программировании — процедура или функция, в теле которой присутствуют ссылки на переменные, объявленные вне тела этой функции и не в качестве её параметров (а в окружающем коде).

Щ>>Должно ли оно обязательно быть лямбда выражением, то анонимной функцией (методом), вложенной в другую? А если вот так:

К>[cut]


Щ>>Это замыкание?


К>По этому поводу есть выражение:

К>

К>Closures are poor man's objects and vice versa.

К>Например, тут
Объясни.
Re[2]: Про замыкания
От: Щъмых Марс  
Дата: 19.08.12 11:26
Оценка:
Здравствуйте, MOByte, Вы писали:

MOB>Здравствуйте, Щъмых, Вы писали:


Щ>>Замыкание (англ. closure) в программировании — процедура или функция, в теле которой присутствуют ссылки на переменные, объявленные вне тела этой функции и не в качестве её параметров (а в окружающем коде).


Щ>>Должно ли оно обязательно быть лямбда выражением, то анонимной функцией (методом), вложенной в другую?


MOB>Что-то много про это замыкание разговоров с ссылками на определение.



Я знаю, что такое замыкание. Я хочу понять, вяжется ли мой пример с определением, которое которое дано выше и если нет, то почему.
Re[3]: Про замыкания
От: Курилка Россия http://kirya.narod.ru/
Дата: 19.08.12 11:35
Оценка:
Здравствуйте, Щъмых, Вы писали:

Щ>Здравствуйте, Курилка, Вы писали:

К>>Например, тут
Щ>Объясни.

По ссылке достаточно разжёвано. Речь о том, что и объекты и замыкания решают схожую задачу немного отличающимся способом (к примеру в объекте контекст виден более-менее явно, тогда как контекст замыкания можно понять лишь сопоставив его код и доступные переменные)
Re: Про замыкания
От: koodeer  
Дата: 19.08.12 11:49
Оценка:
Здравствуйте, Щъмых, Вы писали:

Щ>Замыкание (англ. closure) в программировании — процедура или функция, в теле которой присутствуют ссылки на переменные, объявленные вне тела этой функции и не в качестве её параметров (а в окружающем коде).


Щ>Должно ли оно обязательно быть лямбда выражением, то анонимной функцией (методом), вложенной в другую? А если вот так:



Щ>
Щ>class MyClass{
  
Щ> int var1;
Щ> void method1(){
Щ>  // работаем с var1
Щ> }


Щ>}
Щ>


Щ>Это замыкание?


Нет, это не замыкание. var1 как была так и остаётся полем класса. А при замыкании, например, локальная переменная метода замыкается во вложенной функции, и продолжает существовать, даже когда произошёл выход из метода (из области видимости этой переменной).
Re[3]: Про замыкания
От: MOByte  
Дата: 19.08.12 11:58
Оценка:
Здравствуйте, Щъмых, Вы писали:

Щ>Я знаю, что такое замыкание. Я хочу понять, вяжется ли мой пример с определением, которое которое дано выше и если нет, то почему.


Нет, не знаешь. Я как раз для этого и привел подробный ответ, чтобы ты понял.

В твоем примере нет замыкания, т.е. нет создания функции с захватом свободных переменных.
Re[3]: Про замыкания
От: grosborn  
Дата: 19.08.12 12:58
Оценка:
> Согласно определению, ты неправ.

По определению, если считать методы функциями, а поля переменными.
Ну если по сути, то не создаются ссылки в контексте захвата, нет свойственного замыканиям поведения при исполнении — нет продления времени жизни переменных.
Posted via RSDN NNTP Server 2.1 beta
Забанен на рсдн за применение слова "Маргинал"
Re[2]: Про замыкания
От: Щъмых Марс  
Дата: 19.08.12 13:09
Оценка:
Здравствуйте, koodeer, Вы писали:

K>Здравствуйте, Щъмых, Вы писали:


Щ>>Замыкание (англ. closure) в программировании — процедура или функция, в теле которой присутствуют ссылки на переменные, объявленные вне тела этой функции и не в качестве её параметров (а в окружающем коде).


Щ>>Должно ли оно обязательно быть лямбда выражением, то анонимной функцией (методом), вложенной в другую? А если вот так:



Щ>>
Щ>>class MyClass{
  
Щ>> int var1;
Щ>> void method1(){
Щ>>  // работаем с var1
Щ>> }


Щ>>}
Щ>>


Щ>>Это замыкание?


K>Нет, это не замыкание. var1 как была так и остаётся полем класса. А при замыкании, например, локальная переменная метода замыкается во вложенной функции, и продолжает существовать,


Тогда определение не совсем верное? Тогда есть должна обязательно быть вложенная (анонимная) функция?

>>даже когда произошёл выход из метода (из области видимости этой переменной).

Какого именно метода: вложенного или внешнего?
Re[4]: Про замыкания
От: Щъмых Марс  
Дата: 19.08.12 13:10
Оценка:
Здравствуйте, MOByte, Вы писали:

MOB>Здравствуйте, Щъмых, Вы писали:


Щ>>Я знаю, что такое замыкание. Я хочу понять, вяжется ли мой пример с определением, которое которое дано выше и если нет, то почему.


MOB>Нет, не знаешь. Я как раз для этого и привел подробный ответ, чтобы ты понял.


MOB>В твоем примере нет замыкания, т.е. нет создания функции с захватом свободных переменных.


Я не говорил, что оно там есть. Там спросил, есть ли оно там согласно определению?
Re[5]: Про замыкания
От: BlackEric http://black-eric.lj.ru
Дата: 19.08.12 15:11
Оценка: +1
Здравствуйте, Щъмых, Вы писали:

Щ>Здравствуйте, MOByte, Вы писали:


MOB>>Здравствуйте, Щъмых, Вы писали:


Щ>>>Я знаю, что такое замыкание. Я хочу понять, вяжется ли мой пример с определением, которое которое дано выше и если нет, то почему.


MOB>>Нет, не знаешь. Я как раз для этого и привел подробный ответ, чтобы ты понял.


MOB>>В твоем примере нет замыкания, т.е. нет создания функции с захватом свободных переменных.


Щ>Я не говорил, что оно там есть. Там спросил, есть ли оно там согласно определению?


Согласно вашему определению, да.
Но вопрос полноты этого определения очень интересен. Потому, что по нему получается, что любая функция, использующая глобальную переменную, является замыканием, а это не так.
https://github.com/BlackEric001
Re[6]: Про замыкания
От: Щъмых Марс  
Дата: 19.08.12 16:30
Оценка:
Здравствуйте, BlackEric, Вы писали:

BE>Здравствуйте, Щъмых, Вы писали:


Щ>>Здравствуйте, MOByte, Вы писали:


MOB>>>Здравствуйте, Щъмых, Вы писали:


Щ>>>>Я знаю, что такое замыкание. Я хочу понять, вяжется ли мой пример с определением, которое которое дано выше и если нет, то почему.


MOB>>>Нет, не знаешь. Я как раз для этого и привел подробный ответ, чтобы ты понял.


MOB>>>В твоем примере нет замыкания, т.е. нет создания функции с захватом свободных переменных.


Щ>>Я не говорил, что оно там есть. Там спросил, есть ли оно там согласно определению?


BE>Согласно вашему определению, да.

BE>Но вопрос полноты этого определения очень интересен. Потому, что по нему получается, что любая функция, использующая глобальную переменную, является замыканием, а это не так.
Это из википедии.
Re[4]: Про замыкания
От: D. Mon Великобритания http://thedeemon.livejournal.com
Дата: 19.08.12 17:24
Оценка:
Здравствуйте, grosborn, Вы писали:

G>По определению, если считать методы функциями, а поля переменными.

G>Ну если по сути, то не создаются ссылки в контексте захвата, нет свойственного замыканиям поведения при исполнении — нет продления времени жизни переменных.

Есть ссылка, называется this. Передается с каждым вызовом метода ровно так же, как при вызове замыкания передается ссылка на его захваченные переменные. И со временем жизни все ок — "захваченные" переменные живут столько же, сколько и функция (пока жив объект т.е.).
Re: Про замыкания
От: D. Mon Великобритания http://thedeemon.livejournal.com
Дата: 19.08.12 17:25
Оценка:
Здравствуйте, Щъмых, Вы писали:

Щ>Должно ли оно обязательно быть лямбда выражением, то анонимной функцией (методом), вложенной в другую?


Нет, не должно. Запросто может иметь имя, например.
Re[5]: Про замыкания
От: grosborn  
Дата: 19.08.12 17:33
Оценка: -1
> G>По определению, если считать методы функциями, а поля переменными.
> G>Ну если по сути, то не создаются ссылки в контексте захвата, нет свойственного замыканиям поведения при исполнении — нет продления времени жизни переменных.
>
> Есть ссылка, называется this. Передается с каждым вызовом метода ровно так же, как при вызове замыкания передается ссылка на его захваченные переменные. И со временем жизни все ок — "захваченные" переменные живут столько же, сколько и функция (пока жив объект т.е.).

Глупость какая-то.
Неявная передача ссылки на объект при вызове метода на время жизни объекта и его полей никак не влияет.
Ссылка "this" которая не ссылка, а ключевое слово, передает ровно НЕ так же, как ссылка на объект замыкания.
Posted via RSDN NNTP Server 2.1 beta
Забанен на рсдн за применение слова "Маргинал"
Re[6]: Про замыкания
От: D. Mon Великобритания http://thedeemon.livejournal.com
Дата: 19.08.12 17:44
Оценка:
Здравствуйте, grosborn, Вы писали:

G>Неявная передача ссылки на объект при вызове метода на время жизни объекта и его полей никак не влияет.


Я и не говорил такого. Я говорю, что у метода и данных одно время жизни, ровно как и в случае с замыканием.

G>Ссылка "this" которая не ссылка, а ключевое слово, передает ровно НЕ так же, как ссылка на объект замыкания.


В чем же разница? В обоих случаях при вызове помимо параметров передается одна неявная ссылка — на данные, по сути.
Re[6]: Про замыкания
От: fddima  
Дата: 19.08.12 17:53
Оценка: -1
Здравствуйте, grosborn, Вы писали:

G>Глупость какая-то.

G>Неявная передача ссылки на объект при вызове метода на время жизни объекта и его полей никак не влияет.
G>Ссылка "this" которая не ссылка, а ключевое слово, передает ровно НЕ так же, как ссылка на объект замыкания.
Исключительно зависит от конкретной той или иной реализации языка. Т.е. созданное замыкание вполне может стать объектом, а функция которая использует замыкаение, может стать классом хранящим значения перемнных попавших в замыкание. Но даже если не брать всё это — посмотрине на javascript более пристально — this, конечно же ключевое слово, но передаётся этот this очень даже явно.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.