LINUX.ORG.RU

closure


0

0

Объясните, пожалуйста, что такое замыкания, для чего они применяются на простом примере, желательно, Перл, т.к. как раз его изучаю.

Что знаю: замыкание это функция с привязанными к ней данными. Нашёл очень простой пример на javascript:

function createFunc(n) { return function() { alert(n*n) }; } function create(number) { var arr = []; for (var i=1; i<number; i++) { arr[i] = createFunc(i); } return arr; } var arr = create(100); arr[4]();

а зачем оно надо, ведь, можно же просто в массив загнать функции, которые потом вызывать _с параметром_ который выведется в alert();?

p.s. Ответ: "чтобы можно было вызывать функции без передачи параметра", мне ясности не принесёт. ;)

anonymous

Пардон, забыл про форматирование. Вот код:

function createFunc(n) {
return function() { alert(n*n) };
}
function create(number) {
var arr = [];
for (var i=1; i<number; i++) {
arr[i] = createFunc(i);
}
return arr;
}
var arr = create(100);
arr[4]();

anonymous
()
Ответ на: комментарий от anonymous

А вот небольшой пример, иллюстрирующий работу замыканий:

sub newprint {
  my $X = shift;
  return sub { my shift; print "$x, $y!\n"; };
}
$h = newprint("Howdy");
$g = newprint("Greetings");

# Time passes...

&$h("world");
&$g("e\a\eartglings");

В результате на печать будет выведено:

Howdy, world!
Greetings, earthlings!

[и т.д. по тексту]

theserg ★★★
()

Можно рассматривать замыкание, как блок кода и обращаться с ним, как с объектом.

Пример -- перебор всех элементов списка. Следуя принципу инкапсуляции, оставляем процесс перебора внутри объекта-списка, передавая ему замыкание, т.е. блок кода, который надо выполнять с каждым элементом.

Пример на Smalltalk (суммирование квадратов всех элементов списка):

|list value result|

list := #(1, 2, 5, 10).
result := 0.
list do: [:each | result := result + each * each]

в квадратных скобках -- замыкание, т.е. в данном случае анонимный блок кода, принимающий один параметр (each) и имеющий привязку к внешней переменной result.

ringill
()

1. Замыкание можно использовать как функцию с внутренним состоянием.

2. Замыкание можно использовать как отложенное вычисление.

3. В языках без нормальных макросов создание замыканий может помочь генерировать похожие функций.

mind
()

Перл не тот язык на котором можно посмотреть и протащиться с замыканий :) Если в двух словах, то замыкание -- это не более чем способ для создания функций run-time, а самая естественная среда для таких манипуляций, это любой язык, где функция -- это first class value (хзб как на русском). В таких языках мы создаем функции с той же естественностью, с которой в Перле ты можешь создать переменную типа String и присвоить ей строчку "asdf" и т.д.

А в языках, подобных Перлу, мы СНАЧАЛА пишем все функции, а в течении программы всего лишь пользуемся их довольно жестко заданным функционалом. Замыкания в перле сделаны по принципу "это не баг, это фича"

>а зачем оно надо, ведь, можно же просто в массив загнать функции, которые потом вызывать _с параметром_ который выведется в alert();?

это ты верно подметил !!

PS. какой там синоним у слова "функция" %) ?

CMEPTb
()
Ответ на: комментарий от CMEPTb

>А в языках, подобных Перлу, мы СНАЧАЛА пишем все функции, а в течении программы всего лишь пользуемся их довольно жестко заданным функционалом. Замыкания в перле сделаны по принципу "это не баг, это фича"

В смысле? Чем Перловские замыкания ненормальны?

>PS. какой там синоним у слова "функция" %) ?

Method ;)

Один вопрос ещё. В чём разница между обыкновенной функцией на которую сделали указатель / ссылку и потом этой ссылкой оперируют, передавая её в другие функции и замыканием? Как я понял, только в доступности для замыкания лексических переменных переданных в момент декларации. Т.е. это и есть ключевой момент замыканий? Но, непонятно, все примеры приводимые несколько искусственны, они, например, возвращают аргумент переданный в зымыкание в момент вызовы замыкания, допустим, умноженный на другой аргумент, который был передан в момент декларации замыкания. Но в чём смысл тут????? Можно просто передать два аргумента на момент вызова!

Кстати, это и сеть "ленивое вычисление"? Т.е. вычисление аргумента переданного в замыкание на момент декларации. Иными словами, вычисление лексических переменных доступных на момент описания замыкания?

anonymous
()
Ответ на: комментарий от anonymous

>В смысле? Чем Перловские замыкания ненормальны?

да нах они там не нужны :) это просто Ларри докучи накидал туда, если честно, я понятия не имею зачем, разве что для уменьшения количества строчек в коде, но это не более чем финт ушами

>В чём разница между обыкновенной функцией на которую сделали указатель / ссылку и потом этой ссылкой оперируют, передавая её в другие функции и замыканием?

это несравнимые вещи :)

>все примеры приводимые несколько искусственны

так и есть

>Кстати, это и сеть "ленивое вычисление"?

нее, это когда (0 and X) выдает 0 даже не заботясь о выражении X

короче, как говорится, раскурись хорошенько и влипни в human0id's ссылку. это единственный тру-путь для понимания. воткни в описание SmallTalk, -- через пару дней ты честно поймешь зачем нужны замыкания

CMEPTb
()

> а зачем оно надо, ведь, можно же просто в массив загнать функции, которые потом вызывать _с параметром_ который выведется в alert();?

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

fk0
()
Ответ на: комментарий от anonymous

> в момент декларации замыкания. Но в чём смысл тут????? Можно просто передать два аргумента на момент вызова!

Замыкание, в терминах ООП: функция-объект /* сохраняющая состояние */. Вся суть, естесственно, в сохранении состояния.

fk0
()
Ответ на: комментарий от CMEPTb

> В таких языках мы создаем функции с той же естественностью, с которой в Перле ты можешь создать переменную типа String и присвоить ей строчку "asdf" и т.д.

> А в языках, подобных Перлу, мы СНАЧАЛА пишем все функции,

Ты что-то не то курил. Пойди покури еще. Книжку там какую по Перлу.

anonymous
()
Ответ на: комментарий от anonymous

>Ты что-то не то курил. Пойди покури еще. Книжку там какую по Перлу.

А че такого ? Я утрирую, но уместно, так как чувак не может врубица зачем они уперлись в языке эти замыкания, и почему им вообще выделили отдельное название.

Замыкания в Перле это немного не те замыкания (с теоретической точки зрения) которые можно исполнять на SmallTalk или там Scheme .. да дохрена же языков, где нативность замыканий не вызывает сомнений ! Зачем учить человека плавать на песке если рядом целый океан, ХЕ-ХЕ ну разве если только пыхнуть как следут, ну так можно и на асфальте поелозить брюхом, авось встретишь еще пловцов, будет компания, -- будет колбасно.

CMEPTb
()
Ответ на: комментарий от CMEPTb

> Замыкания в Перле это немного не те замыкания (с теоретической точки зрения) которые можно исполнять на SmallTalk или там Scheme ..

Обоснуй, пожалуйста.

anonymous
()
Ответ на: комментарий от CMEPTb

> Замыкания в Перле это немного не те замыкания (с теоретической
> точки зрения) которые можно исполнять на SmallTalk или там Scheme

ну так поделитесь этой точкой зрения, пока что вы просто
заклинания произносите.

нормальные замыкания в perl, modulo implementation bugs.

в отличие от некоторых реализаций Smalltalk, где возможно
lexical sharing в различных instances одного и того же
блока.

P.S. английские термины не от того, что выделываюсь, просто
не знаю как по-русски.

idle ★★★★★
()
Ответ на: комментарий от idle

перейдем сразу к примерам:

возьмем две строчки и будем их склеивать:

ну мы немного изъе#немся, и вывернем обе строчки в список char'ов потом начнем функцией map применять операцию соединения элемента и списка. Блин мы заюзали побочные возможности языка, прибили комара топором, по-ходу высадили балон бормотухи, даже осталось на утро, нас распирает, вопросов нет. Но наши последователи будут желать нам скорого начала предсмертных мук (думаешь просто так Гвида решил выкинуть map и reduce из Питона; прижали чувака на улице, приставили ножь к яйцам, думаешь Гвида долго сомневался насчет ответа ?). На такого же дровосека похожь тот крендель, который вворачивает заморочки ФП в язык типа перл.

Я не собираюсь спорить с тобой, что любую модель из лямбда-калкулуса, которую можно выписать на схеме, ты сможешь приблизить куском проги на перле (если тебе хватит вачалова и ганжубаса :)) так как спор тут неуместен.

на самом деле, если хочешь постягать, зайди на удафф.ком, там будут рады таким мыслителям как ты (modulo посетители лора) -- это я чисто из соображений местного этикета :)))

CMEPTb
()
Ответ на: комментарий от anonymous

в чем же я не прав ?

ps: или ты это про себя написал ? :)

CMEPTb
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.