Xpoint
   [напомнить пароль]

Помогите понять что такое замыкание

Метки: [без меток]
2009-11-14 01:32:31 [обр] German[досье]

ссылка на программу - как ее правильно оформить?
вот так

use strict 'refs';
my $call = proga();

или вот так:

use strict 'refs';
my $call = \&proga;

Я приведу код, но может здесь что-то очевидное?
Хотя я и верблюда полистал..

спустя 2 часа 35 минут [обр] Роман Чемисов(56/327)[досье]

German[досье]

my $call = proga();

Вернёт результат работы функции, а это скорее всего не то, что Вам нужно...

спустя 4 часа 50 минут [обр] Евгений Седов aka KPbIC(38/176)[досье]
German[досье] "Программу", "оформить"... Для человека, профессионально работавшего еще с Perl 5.6, у вас странная терминология.
спустя 7 часов [обр] German[досье]

 Евгений Седов aka KPbIC[досье] вы хоть читайте внимательней

Я хочу получить более полное и всестороннее представление о работе с closure (перевод какой-то дурацкий - замыкание)

Посмотрим код

use strict 'refs';
my $var = 'kuku'; 
sub proga   {
$var .= ' zamknulo';
}
proga();
print "\$var = $var";

это простейшее closure не так ли?
(я дам пояснение, по тому случаю, когда my $call = proga(); вроде срабатывает не как вызов)

спустя 15 минут [обр] Евгений Седов aka KPbIC(38/176)[досье]

German[досье]

это простейшее closure не так ли?

Не так.

Я хочу получить более полное и всестороннее представление

Для начала хотя бы элементарное получите, на уровне определения. RTFM.

спустя 30 минут [обр] Евгений Седов aka KPbIC(38/176)[досье]

German[досье]

вы хоть читайте внимательней

Это вы о чем?

спустя 30 минут [обр] German[досье]
Евгений Седов aka KPbIC[досье], мне бы хотелось здесь не с малограмотными людьми общаться — а с более продвинутыми,
Поэтому вы умерьте пыл, пожалуйста.
Найдите где-нибудь определение closure а не засоряйте форум. Не старайтесь сделать дураков из других людей — тогда, может быть и вы сам не будете выглядеть таким болваном...
спустя 1 час 3 минуты [обр] German[досье]

Раз не получается без подробностей — дам некоторые подробности... Недавно в Глобусе увидел второй том ламоводства... Думал просмотреть на диване. Там оказалось довольно много интересного.
Например, есть такой код (немного изменен мной)

use strict 'refs';
use File::Find; 
my $total_size = 0;

sub proga   {
   my $count = 0;
   return sub { 
   $size += -s if -f ;
   print ++$count, " file or folder $File::Find::name $size \n"; 
   }   ;
}
my $call = proga(); 
print "\$call = $call \n\n\n";
find($call, '.');

 
Print выводит следующее $call = CODE(0xbf0f0) Все более или менее понятно — ниже следует парметризованный вызов функции, поэтому наверно $call становится ссылкой, а не вызовом функции

Но, в таких случаях, мне были бы интересны какие-то формальные синтксические правила для оформления ссылок.
Оформить стандартную жесткую ссылку вот так

my $call = \&proga;

не получается. Это не работает.

Вот собственно суть проблемы... Я в ней и сам разберусь, но может у кого-то есть опыт нестандартного оформления ссылок?

спустя 34 минуты [обр] German[досье]
а в общем понял, здесь ссылка отдает программа... а ссылается на подпрограмму
всем признателен за участие в обсуждении
спустя 4 часа 38 минут [обр] German[досье]

дам еще поянение, так как раздел для начинающих
Результатом выполнения кода программы proga() является ссылка на безымянную программу

sub { 
   $size += -s if -f ;
   print ++$count, " file or folder $File::Find::name $size \n"; 
   }

Это и написано в «Perl изучаем глубже», просто я не сразу это прочел из-за невнимательности.

спустя 1 день 2 часа [обр] Алексей Севрюков(198/1280)[досье]

German[досье] Код, который Вы привели выше не является замыканием (где у вас $var='kuku'). Так что Вы совершенно зря ругаете KPbICа[досье]. Вы бы для начала сами почитали что такое замыкания.

Поясните пожалуйста зачем Вы создали тему? Причем тут ссылка на программу, если речь о функциях/процедурах? Что конкретно Вам непонятно?

спустя 5 часов [обр] Евгений Седов aka KPbIC(38/176)[досье]

Алексей Севрюков[досье]
Насколько я понимаю, в некоторых учебниках замыканиями названы функции, ссылающиеся на локальные переменные, объявленные вне тела функции. IMHO, это сознательное упрощение, сделанное авторами, потому что нужно еще собственно "замкнуть" такую локальную переменную в ее области видимости, то есть обратиться к ней извне. Если взять код Germana[досье], то замыканием был бы вызов функции из другого файла. Тогда его $var замкнулся бы в своей области видимости, в данном случае — в файле. Или можно было ограничить объявление переменной с объявлением функции блоком.

Я думаю, что в учебнике что-то подобное и сказано, только надо было до конца дочитать главу.

спустя 4 часа [обр] Алексей Севрюков(198/1280)[досье]

Евгений Седов aka KPbIC[досье] "Незнание закона не освобождает от ответственности" (с). Это я к тому, что если в учебнике написано по другому — это еще не делает незамыкание замыканием.

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

спустя 29 минут [обр] Евгений Седов aka KPbIC(38/176)[досье]

Алексей Севрюков[досье]

Поясните пожалуйста зачем Вы создали тему?

Так он же ясно пишет — чтобы узнать о "каких-то формальных синтксических правилах для оформления ссылок" от человека, имеющего "опыт нестандартного оформления ссылок".

спустя 1 час 32 минуты [обр] Алексей Севрюков(198/1280)[досье]

Хорошо, а причем тут замыкания? )
А что такое опыт нестандартного оформления ссылок? Как оформление может быть нестандартных в ограниченных рамках синтаксиса языка?

German[досье] Вариантов всего три:

#!/usr/bin/perl

use strict;

sub subname
 {
  print join(", " => @_),"\n";
 }


# так лучше не делать, если возможно
{
 no strict 'refs';
 my $s="subname";
 $s->(1,2,3);
}

# оптимально
{
 my $s=\&subname;
 $s->(4,5,6);
}

# inline style, функция с локальной видимостью, уничтожается при выходе из блока
# Удобно при создании сложных объектов/классов
{
 my $s=sub 
 {
  print join(", " => @_), "\n";
 };
 $s->(7,8,9);
}

exit(0);

Во-всех вариантах можно использовать и такой синтаксис: &$s(1,2,3), но через оператор -> предпочтительнее ввиду простоты восприятия.

спустя 1 час 10 минут [обр] Евгений Седов aka KPbIC(38/176)[досье]

Алексей Севрюков[досье]

Хорошо, а причем тут замыкания?

Вы что, German'a[досье] не знаете? Купил он книжку. Дошел до File::Find, разобраться не может. И вместо того, чтобы четко сформулировать вопрос, и вежливо его задать, он пришел сюда, и выступает "как директор пляжа" (с).

спустя 15 минут [обр] Алексей Севрюков(198/1280)[досье]
Евгений Седов aka KPbIC[досье] Знаю конечно ))) Да пусть пишет, вдруг на умную мысль натолкнет.
спустя 1 час 14 минут [обр] German[досье]

Алексей Севрюков[досье] в нестандартным оформлением ссылок я просто ошибся. И довольно внятно написал об этом:

просто я не сразу это прочел из-за невнимательности

То есть я признал свою ошибку.

А вот на счет ошибки с определением замыкания, я думаю, здесь другие поторопились. Не я
Читаем:

замыкание — это подпрограмма, которая может обращаться к лексическим переменным, расположенным вне области видимости данной подпрограммы

Если это не так — значит господа Randal LSchwartz, brian d foy & Tom Phoenix — дураки. А Крыс у нас самый умный. Но, я боюсь, все-таки скорее — наоборот.

Наконец, я бы не из кого не делал здесь дураков. Это манера Крыса, который обладая достаточно заурядными познаниями, проталкивает здесь свои недалекие мысли, под видом истины в последней инстанции... А поскольку своих мыслей мало, делится нечем, старается и других сравнять с собой или представить еще хуже (последнее, понятно, невозможно)

А теперь по делу. Вот это (как я писал выше) — замыкание

use strict 'refs';
my $var = 'kuku'; 
sub proga   {
$var .= ' zamknulo';
}
proga();
print "\$var = $var";

Допустим даже я в чем-то не прав. Так дайте тогда внятное определение, объясните тонкости (только Крыса прошу не беспокоится). Это же интересно, не так ли?

А слушать о том, что кто-то здесь самый умный — неинтересно. Задача простая — показать минимальное, атомарное замыкание для того, чтобы более точно сформулировать здесь определение

спустя 20 минут [обр] Алексей Севрюков(198/1280)[досье]

German[досье] Ваш пост с листингом примера из File::Find как раз и является правильным минимальным замыканием.

замыкание — это подпрограмма, которая может обращаться к лексическим переменным, расположенным вне области видимости данной подпрограммы

Вы сами в эту фразу в читайтесь. Как подпрограмма вообще может обращаться к лексическим переменным, которые находят вне ее области видимости? Это же невозможно.
Вашу фразу неправильно перевели. Wikipedia больше соотвествует действительности:

Замыкание (англ. closure) в программировании — процедура, которая ссылается на свободные переменные в своём лексическом контексте.

Опять же, повторюсь. Если все понимать слишком буквально и притягивать за уши то почти любая программа по Вашему получается с замыканиями, хотя технически это не так. Речь о процедурах, а не о программах. Вы же приводите пример программы, где переменная объявлена не в ограниченном, а в полуглобальном контексте (т.е. Вы можете обратится к ней из любого места этого файла, но не можете из другого файла/модуля). Замыкание же подразумевает что только одна или несколько подпрограмм объявленных в определенной области видимости могут обращаться к этой переменной и больше к ней никак обратится нельзя.
Простейший пример замыкания (взято с той же wikipedia и сразу же показано как использовать):

# возвращает анонимную функцию
sub adder{
   my $x = shift;   # в котором x - свободная переменная,
   sub{
      my $y = shift;   # а y - связанная переменная
      $x + $y;
   };
}
 
$add1 = adder(1);   # делаем процедуру для прибавления 1
print $add1->(10);   # печатает 11
 
$sub1 = adder(-1);   # делаем процедуру для вычитания 1
print $sub1->(10);   # печатает 9

Фактически, с помощью замыканий организуют некое подобие объектов. Тот же эффект Вы можете получить, используя пакеты.

Герман, тема называется "ссылка на подпрограмму". Может вынести вопрос о замыканиях в отдельную тему, или давайте я переименую эту тему?

P.S. Наверно сегодня какие то магнитные бури, все вырывают слова из контекста и как то агрессивно себя ведут.

спустя 23 минуты [обр] Евгений Седов aka KPbIC(38/176)[досье]

German[досье]
Пока вас, не сделали модератором в этом форуме, я пожалуй наплюю на ваши рекомендации относительно того, о чем мне можно беспокоиться, а о чем нет.

Алексей Севрюков[досье]

Вашу фразу неправильно перевели.

Возможно, имелась в виду точка вызова подпрограммы.

спустя 14 минут [обр] German[досье]

Тема, конечно, не про замыкания. И я упомянул об этом, между прочим, предполагая, что closure могут иметь отношение к делу.

my $call = proga(); # возвращает ссылку на безымянную функцию; является замыканием на код функци (ссылкой)

Но обязательно ли замыкание должно быть ссылкой? Вроде нет...
Обязательно ли функция должна быть безымянной? Тоже вроде нет.

Что же делать? Иногда пол-книги можно прочитать не вставая с дивана. И так все понятно. А иногда несколько строк нужно проанализировать как следует. Для того, чтобы понимание было полноценным.

Алексей Севрюков[досье] Если этот код, который я привожу в третий раз — не замыкание, то как же он работает?

use strict 'refs';
my $var = 'kuku'; 
sub proga   {
$var .= ' zamknulo';
}
proga();
print "\$var = $var";

Возможно, такое применение замыканий просто пример не очень красивого применения замыканий, который не особо хотят пропагандировать? Но от этого замыкание proga() не перестает быть замыканием, не так ли?

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

Видите ли, я хочу понять, а не объяснить. И ни в какой мере не стремлюсь объяснить не понимая

Программирование — все-таки точная наука. И для любого явления должно, или, во всяком случае, может существовать определение (если это не число, функция и др основополагающие понятия).

Переименовать эту тему — наверно можно. И даже можно выделить из нее какую-то часть. Хотя — зачем? Сейчас я сделаю новую тему, потому что раз уж взялся, нехорошо бросать на середине...

спустя 3 минуты [обр] Евгений Седов aka KPbIC(38/176)[досье]
сообщение промодерировано
Алексей Севрюков[досье] А вот это по-вашему — замыкание?
my $func;
{
  my $var = 'Hello';
  $func = sub {print "$var\n";};
}
$func->();
спустя 8 минут [обр] Евгений Седов aka KPbIC(38/176)[досье]

German[досье]

Что же делать?

Надо вас в поликлинику сдать. Для опытов. (с)

спустя 10 минут [обр] Алексей Севрюков(198/1280)[досье]
Евгений Седов aka KPbIC[досье] конечно замыкание.
спустя 8 минут [обр] Алексей Севрюков(198/1280)[досье]

German[досье] Нет, Герман, это не замыкание. Это программа, в которой объявлена глобальная переменная (см. мой пост выше про полуглобальность), процедура, которая делает конкатенацию строк, и потом идет вывод измененной переменной. Почему это не замыкание? Да потому что я могу к этой же переменной обратится из любого места программы, она в глобальной области видимости.

Если рассматривать всю программу как подпрограмму то это уже замыкание. В Вашем конкретном случае - нет. Об этом я тоже уже писал, что если притягивать все за уши - тогда замыканием можно назвать практически что угодно.

спустя 3 минуты [обр] Алексей Севрюков(198/1280)[досье]
German[досье] хотите понять - пожалуйста почитайте, например, тут, ну и гугл: что такое замыкание.
спустя 9 минут [обр] Евгений Седов aka KPbIC(38/176)[досье]
Алексей Севрюков[досье] Я к тому, что неутомимый Герман создал еще одну тему по этой же проблеме, где он собрался, в частности, осветить вопрос обязательности наличия двух подпрограмм для иллюстрации "минимального атомарного простейшего замыкания".
спустя 4 минуты [обр] Алексей Севрюков(198/1280)[досье]
М Дорогой German[досье]. Я переименовал эту тему и закрыл новую по причине того, что в этой теме уже большая часть относится к замыканиям, а две одинаковые темы нам не к чему, не так ли?
спустя 6 минут [обр] Евгений Седов aka KPbIC(38/176)[досье]
German[досье] Ответьте сами себе на вопрос (мне можете не отвечать): что у вас в коде делает строка use strict 'refs';, которую вы везде за собой таскаете. Считаете, что она обладает чудодейственной силой?
спустя 9 минут [обр] German[досье]

Спасибо, конечно, за переименование темы.

Но я просил этого не делать. Вы лучше не помогайте разобраться — а разберитесь самостоятельно.
С помощью замыкания мы получаем доступ к переменной подпрограммы. Вот, еще один пример (оттуда же), когда замыкание возвращает значение из подпрограммы

use strict 'refs';
use File::Find; 
sub proga { 
my $total_size = 0; 
   return sub { 
      if (@_) {    
      return $total_size; 
      } 
      else {    
      $total_size += -s if -f; 
      } 
   }   ; 
} 
my $callback = proga();
find($callback, '.'); 

my $total_size = $callback->('фиктивный вызов'); 
 
print "total size = $total_size\n";

теперь закомментируем в этой программе две строчки

use strict 'refs';
use File::Find; 
sub proga { 
#my $total_size = 0; 
   return sub { 
      if (@_) {    
      return $total_size; 
      } 
      else {    
      $total_size += -s if -f; 
      } 
   }   ; 
} 
my $callback = proga();
find($callback, '.'); 
#my $total_size = $callback->('фиктивный вызов');  
print "total size = $total_size\n";

где замыкание перестало быть замыканием?
мне надо разъяснять что такое замыканием или Вам?

спустя 2 минуты [обр] German[досье]
Уважаемый Алексей ! [досье]
Вот не надо избавляться от неудобных вопросов закрытием темы. Я просил непереименовывать эту тему. А разъянения по этой теме нужны не мне - а вам
спустя 6 минут [обр] German[досье]

Евгений Седов aka KPbIC[досье], вы хоть бы что-нибудь умное или полезное написали

что у вас в коде делает строка use strict 'refs'

а то как-то неудобно за вас. Что вы все гоношитесь попусту?
Алексей Севрюков[досье] хоть в теме.
Хотя закрыть глаза на какой-то вопрос - иногда вовсе не означает автоматическое решение этого вопроса (я имею в виду закрытие темы).

спустя 3 минуты [обр] Евгений Седов aka KPbIC(38/176)[досье]
German[досье] Замените use strict 'refs'; на use strict;, тогда продолжим.
спустя 3 минуты [обр] Евгений Седов aka KPbIC(38/176)[досье]

German[досье]

вы хоть бы что-нибудь умное или полезное написали

А то как же? Вы мечтали о "минимальном замыкании"? - несколькими постами выше я вам его дал. То, что вам не хватает ума понять своего счастья — не моя вина.

спустя 8 минут [обр] Роман Чемисов(56/327)[досье]
German[досье]
Вот как у них написано:
The kind of subroutine that can access all lexical variables that existed at the time we declared it is called a closure (a term borrowed from the world of mathematics). In Perl terms, a closure is just a subroutine that references a lexical variable that has gone out of scope.
спустя 14 минут [обр] Алексей Севрюков(198/1280)[досье]

Я сдаюсь. Надоело. Тема ни о чем, о переливании из пустого в порожнее.
Теперь я в качестве слушателя. Ибо, как выяснилось, я не знаю что такое замыкания.
German[досье], я весь во внимании, объясняйте мне.

P.S. Я не избавлялся от "неугодной темы", как Вы выразились, я закрыл дубликат.

Роман Чемисов[досье] да, вот это мне и кажется самым правильным и точным определением.

спустя 5 минут [обр] German[досье]

Уважаемый Алексей ![досье]
В другой теме все сформулировано лучше, конкретней, ближе к делу...
Там яснеее, что возразить мне — просто нечего.

Танцы з бубуном вокруг замыкания — совсем неуместны, понятие элементарное. Хотя есть хитрые и полезные применения

Вот код с предложенной заменой (вы сделали важное замечание, нисколько не спорю)

Но код будет работать в таком виде

use strict;
use File::Find; 
my $total_size;
sub proga { 
$total_size = 0; 
   return sub { 
      if (@_) {    
      return $total_size; 
      } 
      else {    
      $total_size += -s if -f; 
      } 
   }   ; 
} 
my $callback = proga(); 
find($callback, '.'); 
#$total_size = $callback->('фикция'); 
print "total size = $total_size\n";

разве здесь больше нет замыкания? просто видимость в "полуглобальной" области (как вы это назвали) — это тоже разновидность замыкания, ничем не хуже и не лучше других

Роман Чемисов[досье], благодарю вас. Я не сумел это найти. Но вроде перевод хороший.

Честно говоря, мне было бы интересней обсуждать эту тему в другой теме, там все более очевидно. Но тема, к сожалению, закрыта, а название этой темы делает из меня идиота, задающего глупые вопросы. Не нравится мне такой подход, это совершенно естественно

А определение — и простейший пример замыкания я дал и здесь в другой теме
Но там и у меня есть сомнения, иначе бы я не писал на форум.

спустя 9 минут [обр] Евгений Седов aka KPbIC(38/176)[досье]
Роман Чемисов[досье] Похоже, с английским у него туго. Не переведете?
спустя 1 час 14 минут [обр] Евгений Седов aka KPbIC(38/176)[досье]

German[досье]

разве здесь больше нет замыкания?

Есть тут замыкание, но не там где вы думаете. Замыкается $total_size в лексической области видимости целого файла, благодаря тому, что вы "выбрасываете наружу" ссылку на подпрограмму $callback.
Пример крайне неудачный. И неудачен он тем, что слишком сложен, а вы пока в элементарных вещах путаетесь.

спустя 1 час 13 минут [обр] German[досье]

Евгений Седов aka KPbIC[досье] человек вы, судя по всему, недалекий, и спорить с вами неинтересно.

Есть тема атомарное = минимальное = простейшее замыкание (closure) — в пределах ее посылок было бы интересно обсуждать этот вопрос. То есть выделить замыкание, как таковое, без мишуры.

Евгений Седов aka KPbIC[досье] вы тоже можете туда заглянуть. В пределах случайных ошибок на уровне синтаксиса для школьников вы мыслите неплохо, так что сможете найти ошибку и у меня во втором посте новой темы. Но эта ошибка — просто спешка... А по сути вы нигде ничего не добавили

Иное дело - господа Алексей Севрюков[досье] и Роман Чемисов[досье]. С ними интересно общаться, даже если они в чем-то были бы неправы по сути.

Мне представляется что ниже есть замыкание (суть кода не изменилась)

use strict;
use File::Find; 
my $total_size=0;
sub proga {  
$total_size += -s if -f; 
} 
my $callback = \&proga; 
find($callback, '.'); 
print "total size = $total_size\n";

Если его нет - было бы целесообразно найти на каком этапе оно исчезло
Но, право, лучше это сделать в специально созданной мной для этого теме.

Еще раз нужны не примеры применения замыкания. А пример где замыкание есть - и где пропало.

спустя 35 минут [обр] German[досье]

да в последнем случае замыкания уже нет

надо признать - я был не прав.
Приношу всем извинения

Наконец, понял

спустя 14 минут [обр] German[досье]
хотя, конечно, определения было бы интересно завершить, так как не всем покажется что замыкания нет, когда повторное обращение суммирует значения вразных директориях
спустя 16 минут [обр] Евгений Седов aka KPbIC(38/176)[досье]
German[досье] Как раз наоборот — есть замыкание, и я уже про это говорил. У вас случайно другой профессии нет?
спустя 1 час 13 минут [обр] German[досье]

Евгений Седов aka KPbIC[досье] с вами бы я и не согласился что его нет
Мне просто надоело, доказывать что замыкание нажно искать в другой теме. Когда там найдете — тогда можно будет считать что у вас просветление... Иначе вы как-то попусту гоношитесь — и сказать-то ничего не решаетесь, и молчать не научились.

Вот грусто, что такие люди могут заявлять о себе в качестве профессионалов. Кто-нибудь еще поверит. Реальная тема здесь
атомарное = минимальное = простейшее замыкание (closure)
Если здесь нет замыкания — то нетрудно было бы показать, что его нет и в этой теме. Подумайте на досуге. Все остальные уже догадались

спустя 25 минут [обр] German[досье]

либо замыкания нет и в предыдущем примере кода — либо оно есть и здесь

use strict;
my $total_size=0;
sub proga {  
$total_size +=10; 
} 
sub find {
my $ras = shift;
&$ras;
}
my $callback = \&proga;
find($callback);
print "total size = $total_size\n";

Либо оно исчезнет в следующем примере как все (кроме KPbIC'а[досье])
как я понимаю, уже догадались

и тогда можно будет вновь открыть тему, которую я создал ранее
атомарное = минимальное = простейшее замыкание (closure)

Либо замыкание здесь есть, но уже плоховатое ? :))

спустя 32 минуты [обр] German[досье]

то есть в конце-концов я хочу сказать — что замыкание — это просто способ
как сущность это присутствует даже здесь
атомарное = минимальное = простейшее замыкание (closure)
а как способ что-то делать — замыкание реализуется разными методами.
Говорить что замыкания нет в этом коде

use strict 'refs';
my $var = 'kuku'; 
sub proga   {
$var .= ' zamknulo';
}
proga();
print "\$var = $var";

неправильно, оно или там есть - или, как таковое, оно не обнаружится нигде

Если для пояснений понадобятся дополнительные иллюстрации - я их дам

спустя 5 часов [обр] Алексей Полушин(0/231)[досье]
А в определении, которое на английском, что такое "has gone out of scope" в конце?
спустя 4 часа 18 минут [обр] Алексей Севрюков(198/1280)[досье]
German[досье], почитав Ваши посты я решил открывать Вам созданную Вами тему, дабы Вы могли просвятить сообщество точки на тему замыканий.
спустя 51 минуту [обр] Евгений Седов aka KPbIC(38/176)[досье]

Ладно, последний раз взмахну ушами:

German[досье]
Замыкание - это вызов функции, оперирующей лексическими переменными, объявленными вне тела функции и невидимыми в точке вызова.

1.
Ваш последний код:

use strict 'refs';
my $var = 'kuku'; 
sub proga   {
$var .= ' zamknulo';
}
proga();
print "\$var = $var";

Есть "функция, оперирующая лексическими переменными, объявленными вне тела функции"? - есть. Функция — proga, переменная — my $var.
Видна переменная $var в точке вызова функции? - Видна. Под определение не подходит, значит это НЕ замыкание.

2.

use strict;
use File::Find; 
my $total_size=0;
sub proga {  
$total_size += -s if -f; 
} 
my $callback = \&proga; 
find($callback, '.'); 
print "total size = $total_size\n";

Есть "функция, оперирующая лексическими переменными, объявленными вне тела функции"? - есть. Функция — proga, переменная — my $total_size
Видна переменная $total_size в точке вызова? - не видна. Потому что точка вызова находится в другом файле — File::Find, а у total_size область видимости ограничена только файлом, в котором она объявлена. Под определение подходит, значит это замыкание.

3.

use strict;
my $total_size=0;
sub proga {  
$total_size +=10; 
} 
sub find {
my $ras = shift;
&$ras;
}
my $callback = \&proga;
find($callback);
print "total size = $total_size\n";

Есть "функция, оперирующая лексическими переменными, объявленными вне тела функции"? - есть. Функция — proga, переменная — my $total_size
Видна переменная $total_size в точке вызова? - видна. Не подходит под определение, следовательно — замыкания нет.

спустя 3 часа 25 минут [обр] German[досье]
German[досье], почитав Ваши посты я решил открывать Вам созданную Вами тему, дабы Вы могли просвятить сообщество точки на тему замыканий.

Алексей Севрюков[досье] благодарю.

Я просвящу. Хотя прошу заметить — сообществу наверно интересней применение замыканий, а вовсе не определение. А я с ним впервые разбираюсь, и пока не применял его на практике. Кроме того я не рвался писать на эту тему — меня к этому просто вынудили.
Я понимаю, что иногда слегка осадить безграмотные и амбициозные заявления.
Такие, например, как последнее выссказывание Евгений Седов aka KPbIC[досье]
Какие у него различие между вторым и третим случаем? (чуть выше) Никаких.

Но этого то ли не видит (тогда это даже не лечится), то ли не признает. Здесь уже ничего не поделаешь. Обсуждение про замыкание будет продолжено в другой теме

спустя 8 минут [обр] German[досье]

Алексей Полушин[досье]

А в определении, которое на английском, что такое "has gone out of scope" в конце?

Мне представляется что правильный перевод - находится вне области видимости. Если вы полагаете, что важно то, что что бы то ни было находилось некогда в области видимости — а потом оттуда вышло — тогда это вроде надо сформулировать более обстоятельно.
Пусть там даже определение будет на страницу — мы же не учебник пишем — мы (как говаривал старик Набоков) должны здесь как можно точнее описать «требуемую гнусность»
продолжение здесь
атомарное = минимальное = простейшее замыкание (closure)

спустя 34 минуты [обр] Евгений Седов aka KPbIC(38/176)[досье]

German[досье]
Разница в том — Где происходит разыменовывание ссылки $callback.

Во 2-ом варианте это происходит в файле File/Find.pm, и там уже переменная $total_size не видна. (если не верите, откройте этот файл и найдите строку $wanted_callback->();)

В 3-ем варианте разыменовывание (то есть вызов функции) происходит в том же файле, где у вас объявлена $total_size, и тут она видна.

Поэтому 2 — замыкание, а 3 — нет.

спустя 2 часа 5 минут [обр] Dennis F. Latypoff aka funky_dennis(24/78)[досье]
а зачем все это?+--
спустя 29 минут [обр] Алексей Севрюков(198/1280)[досье]
Dennis F. Latypoff aka funky_dennis[досье] как зачем? чтобы переливать из пустого в порожнее конечно же.
спустя 3 часа 30 минут [обр] German[досье]

Мне тоже неинтересно переливание из пустого в порожнее... Существующее определение замыкания дает довльно ясное представление о существе впороса... Какая ссылка и где "видна" в существующем определении не упоминается.

Интересно ли придумывать новое, специальное определение, которое бы оправдало то, что Евгений Седов aka KPbIC[досье] ляпнул сгоряча, не подумав, как следует? Никому кроме него самого это неинтересно.

спустя 10 часов [обр] Алексей Полушин(0/231)[досье]
Какая ссылка и где "видна" в существующем определении не упоминается
Разве в вашем определении "область видимости" не упоминается ?
спустя 29 минут [обр] Евгений Седов aka KPbIC(38/176)[досье]

German[досье]

Randal LSchwartz, brian d foy & Tom Phoenix — дураки

Ну, не знаю... Но очевидно, что они никак не предполагали что их книга попадет к вам в руки.

Алексей Севрюков[досье]
Вам не кажется, что уже пора наградить героя?

спустя 1 час 4 минуты [обр] Роман Чемисов(56/327)[досье]
Алексей Севрюков[досье]
На мой взгляд это чистой воды троллинг.
спустя 2 часа 31 минуту [обр] Алексей Севрюков(198/1280)[досье]
! German[досье], устное предупреждение. Не переходите на личности, иначе я буду просто вынужден Вас наказать. Существуют правила форума, который для всех одинаковы. Если Вы их забыли, прочтите снова, они очень простые: http://xpoint.ru/help/
спустя 29 минут [обр] German[досье]

Роман Чемисов[досье] ! Именно тролинг. — ловкое расжигание споров разными способами. Крыс ходит за мной по форуму — и ищет где напакостить. Можно попросить его не гадить, в темах, созданных мной? Людей здесь не так много — пусть все-таки пакостит не везде.
___________________________

Уввжаемый, Алексей Севрюков[досье]!
Разве я переименовал эту тему в тему про замыкания? Нет, я просил не переименовывать тему. Просил довольно настойчиво. Наконец, просто настаивал. Я не задавал того вопроса, который мне приписывается. Это неправильно не по правилам форума — а просто по человечески

Но давайте все-таки где-то остановимся. До этого Евгений Седов aka KPbIC[досье] просто всеми силами старался оправдать свою дурость. А теперь он уже начал делать подлости.

Он ловко вытащил из контекста мою цитату, цитату, смысл которой в контексте прямо противопложный. Может банить пора не меня? Я не называл дураками уважаемых авторов книги. Выдернуть из конетекста мою цитату - и перевернуть ее значение наоборот — это просто подлость.

И вас этот самый Евгений Седов aka KPbIC[досье] призывает вас соучавствовать в подлости! Не поддавайтесь!

спустя 46 минут [обр] Алексей Севрюков(198/1280)[досье]

! German[досье], Вы можете спорить сколько угодно. Только Евгений Седов aka KPbIC[досье] говорил все по делу, и, более того, правильно. Вы не правы и не хотите этого признавать. Я в самом начале сказал Вам что у Вашей фразы неверный перевод. Нет, авторы книжки не дураки. Дураки переводчики, которые неверно трактовали определение. Вам уже дали родное определение на английском которое доказывает что Вы не правы, что еще Вам непонятно?
В любом случае никто не дает Вам права переходить на личности и оскорблять людей.

Мое терпение заканчивается. Тема превратилась в полный балаган. Еще один подобный выход и я закрываю тему. На Ваш первоначальный вопрос "какие виды ссылок на функции существуют" Вам уже давно ответили.

Я не психолог чтобы разбираться в Ваших личных отношениях и неприязни друг к другу, я модератор этого форума, программист. Чуете разницу?
Поэтому я последний раз прошу всех участников темы прекратить балаган и говорить только по теме, если сказать по теме нечего — пересильте себя и не флудите, Вы же взрослые люди в конце концов, так и ведите себя по взрослому.

спустя 43 минуты [обр] German[досье]

нет, авторы не дураки... и я этого никогда не говорил
но не дураки и переводчики. Present Perfect обычно более сосредоточено на результате, а не на причине. Не на прошлом, а на настоящем. Для того, чтобы подчернуть значение прошлого и продолжение его в настоящем времени вроде используется The Present Perfect Continuous. Наконец, разница в трактовках перевода все равно ровным счетом ничего не меняет.

Да и посмотрите книжку — это один из тех нечастых случаев, когда перевод очень хороший, очень доброкачественный.
А вот такого первоначального вопроса

На Ваш первоначальный вопрос "какие виды ссылок на функции существуют" Вам уже давно ответили.

я не задавал. И вы это отлично знаете. Тему переименовали без меня

Я же с самого начала предлагал обсуждать этот вопрос в другой теме
Почему?

Потому что замыкание — это, с моей точки зрения — программисткий прием, а во все не какая бы то ни была значимая сущность. Как сущность это почти что nihil, ничто, это можно и нужно знать и понимать — но использовать это нужно и можно именно как прием.

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

Но именно в отдельной теме. А эту тему можно было давно закрыть или даже удалить, так как ее то соль в том, что программа может возвращать ссылку. Об этом был мой вопрос — и я же дал на него ответ. Такое использование программы (получение ссылки) тоже, видимо, можно было бы назвать одним из видов замыкания

Вы другого мнения? Это ваше право. Но я бы не поддреживал тех крысов, которые только тем и могут сделать себе авторитет, что опрофанить других участников форума. Да еще и применяет при этом подловатый прием внеконтекстного цитирования.

Давайте как-то выходить на спокойный диалог — без ловких крысинных провокаций, бех огульных обвинений меня в том, чего не делал и не собирался

спустя 22 минуты [обр] Алексей Севрюков(198/1280)[досье]

German[досье] давайте конечно.
Понимаете, Герман, Ваша точка зрения о том, что такое замыкание никого не интересует. Почему? Потому что те, кому это нужно и так знают что это такое и этим людям совершенно не интересно слушать Вашу точку зрения, которая не совпадает с оригинальным определением.
Дать замыканию определение то же самое что изобрести велосипед. Зачем давать определение если этот термин уже продуман, реализован и успешно используется. Или Вы думаете что если Вы помидор назовете огурцом — огурец от этого покраснеет и станет круглым? Конечно нет. Так и здесь.

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

спустя 27 минут [обр] German[досье]

Понимание того, что замыкание — это прежде всего программисткий прием, а не какая-то сущность — многое дает людям. Есть масса форумов, на которых все подряд ищут эту сущность. Ищут то, чего нет (точнее то, чего нет как приёма, что неинтересно само по себе).

Замыкание многоугольника в геометрии — это может быть и сущностью и приемом. А в программисткой практике — интересен прием, а не сущность, и эти вещи разнятся.

Именно я здесь дал то понимание, которое уже позволяет не искать сущности, а сосредоточится на применении, на области использования
_____________________________

Но спор в этой теме все-таки небесполезен. Иногда сто раз подумаешь прежде чем задать вопрос здесь. Сразу находится куча советчиков, которые знают и понимают предмет гораздо хуже тебя — но вовсю стремятся самоутвердится, рассказывая всем подряд, какие вокруг собрались идиоты.

Вопрос непростой, конечно. Совсем непросто установить или придумать форумную этику, которая была бы понятной и приемлимой для большинства. Но наверно какие-то шаги в этом направлении нужны.

спустя 1 час 37 минут [обр] Алексей Севрюков(198/1280)[досье]
сообщение промодерировано
German[досье] Этот прием ничего не дает людям, за всю свою практику (достаточно длительную) я не использовал замыкания. Не было нужды и вряд ли появится. Простые объекты я не использую, а сложные реализовывать на замыканиях глупо, для этого есть пакеты.
И я думаю я далеко не единственный.
спустя 14 минут [обр] Евгений Седов aka KPbIC(38/176)[досье]
спустя 2 минуты [обр] Евгений Седов aka KPbIC(38/176)[досье]
Алексей Севрюков[досье] Может опять открыть эту тему?
спустя 7 минут [обр] Алексей Севрюков(198/1280)[досье]
Евгений Седов aka KPbIC[досье] я не могу поднять тему из архива.
спустя 12 минут [обр] Евгений Седов aka KPbIC(38/176)[досье]
Алексей Севрюков[досье] Походите там по ссылкам, вам понравится.
спустя 24 минуты [обр] Алексей Севрюков(198/1280)[досье]
Евгений Седов aka KPbIC[досье] походил, не понравилось. Я не люблю теорию, а по большей части предпочитаю практику. А про практику я уже сказал выше. Может я просто глуп для этих вещей и не понимаю всех прелестей (свои знания по Perl я оцениваю максимум на троечку, основы вроде знаю, маном пользоваться умею, для моих задач вполне хватает).
спустя 9 минут [обр] Евгений Седов aka KPbIC(38/176)[досье]
Алексей Севрюков[досье] Насчет практики, я вам на пейджер сбросил.
спустя 14 часов [обр] Василий Свиридов(0/175)[досье]
Этот прием ничего не дает людям
Ну, на счёт того, что замыкания не использются нигде - это перебор. Это один из краеугольных камней функциональных языков...
спустя 3 часа 30 минут [обр] Алексей Севрюков(198/1280)[досье]
Коллеги, простите меня пожалуйста, я поторопился с выводами "за всех". Я остаюсь при своем мнении, но говорю только за себя.
спустя 15 часов [обр] AB...(10/233)[досье]
Да, тема раздута. На самом деле Алексей Севрюков[досье] и Евгений Седов aka KPbIC[досье] дали полное объяснение. Даже Роман Чемисов[досье] дал оригинал определения. На мой взгляд, если определение не нравиться, это не означает, что оне не верное и тем более, что оно может показаться непонятным с первого взгляда.
Уважаемый автор темы German[досье] просто не разобрался в этом еще. Это нормально, мы все строим наши выводы на существующем опыте и невсегда верный перевод (поэтому я предпочитаю оригинальную, по возможности на английском). Данная тема явно будет переосмыслена автором позже.
В настоящий момент German[досье] просто путаем глобальное определение переменной и все похоже перепуталось.
Примеры действительно, как уже было замеченно, лучше использовать простые для понимания и не привлекать модули с определенной сложностью построения.
I would say over all - this is time to finish current topic without unreasonable pollution.
спустя 19 часов [обр] German[досье]

Алексей Севрюков[досье] писал

за всю свою практику (достаточно длительную) я не использовал замыкания.

оно и видно, хотя, конечно, не использовать замыкания просто невозможно, хотя бы неявно. Не использовал замыкания как приема программирования — возможно. А понимание сущности совершенно необязательно.

В общем интересная получилась тема, хотя она давно уже стала не про перл... Абстрактное мышление свойственно далеко не всем. Разбираться с чем-то подробно — практически никому не нужно и неинтересно. Может быть, это правильно?

Я остаюсь при своем мнении, и тот, кому на самом деле будет интересно существо вопроса, возможно, когда-нибудь присоединиться ко мне.

спустя 12 часов [обр] Алексей Севрюков(198/1280)[досье]
German[досье] да, так и есть, полностью с вами согласен.
Powered by POEM™ Engine Copyright © 2002-2005