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

атомарное = минимальное = простейшее замыкание (closure)

Метки: [без меток]
[удл]
2009-11-16 18:22:24 [обр] German[досье]

атомарное = минимальное = простейшее
замыкание (closure)

Сформулирую задачу. Не всех здесь устроило определение данное гг Randal LSchwartz, brian d foy & Tom Phoenix в их книжке Intermediate Perl
Это определение звучит так

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

Это определение взято из русского перевода книжки, так что можно предположить, что перевод неточный. Я считаю, что здесь перевод правильный. И на основе этого предлагаю следующий код, как простейшую иллюстрацию к понятию ==[closure]== (код рабочий)

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

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

В этом топике мы ставим задачу дать самую минимальную иллюстрацию closure
Обязательно ли замыкание должно быть ссылкой? Вроде нет...
Обязательно ли функция должна быть безымянной? Тоже вроде нет.
Обязательно ли замыкание должно состоять из двух вложенных друг в друга функций (процедур, подпрограмм). Вот мне тоже кажется, что нет — необязательно.

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

спустя 18 минут [обр] German[досье]
исходя из этого кода можно вообще не объявлять переменную my $var — она и так будет работать как my $var, если она объявлена в подпрограмме без спецификатора my
...хотя для меня это несколько неожиданно. Но вроде разобраться с этим интересно.
спустя 2 минуты [обр] Алексей Севрюков(198/1280)[досье]
сообщение промодерировано
М German[досье] давайте не будем плодить темы?
спустя 17 часов [обр] Алексей Полушин(0/231)[досье]
Не "расположенным вне области видимости данной подпрограммы", а "вышедшим из области видимости".
Функция завершила выполнение - ее локальные переменные вышли из области видимости. А замыкание может обратиться к локальным переменным функции, которая завершила выполнение.
спустя 4 часа 15 минут [обр] German[досье]

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

Как способ сделать что-то важное нужное полезное удобное при программировании — замыкание реализуется разными методами. Интересные иллюстрации даны Алексеем Севрюковым[досье] в другом топике (переименованным не мной)
Помогите понять что такое замыкание

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

Кроме того - здесь можно с другого конца вести спор о том, есть ли замыкание в том или ином коде. Правда, едва ли это интересно, так как теперь уже довольно очевидно...

спустя 4 дня [обр] German[досье]

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

Но все-таки попытаюсь...

use strict;
my $var = 'kuku'; 

# область 0


   sub proga   {
   my $some = shift;
   $var .= ' zamknulo';
# область 1

   return $some;
   }

# область 0


proga();
print "\$var = $var";

Есть две области

  • область 0
  • область 1

Между ними возможен стандартный обмен данными — через передачу паметров — типа my $some = shift;
и через возвращение значения переменной (значения а не ссылки!) - return $some;

Вот этот стандартный обмен данными — это не замыкание.

Всякий другой способ обмена данными (между этими 'областями') — это замыкание. Можно передать значение через файловую систему - это будет замыкание. Можно передать данные ну луну - и получить обратно сигнал (в подпрограмму). Это будет замыкание.

Давно известен такой стандартный метод обмена информацией — можно передать в sub qw(подпрограмму функцию процедуру модуль) — ссылку на хеш. С помощью этой ссылки обмениваться данными сколько угодно. По идее — и это тоже будет замыкание (хоть и не похоже)

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

Примечание: этот топик имеет чисто теоритическое значение, не имеющее практического применения при программировании...

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

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

PPS: только яуже ничего никому не доказываю — другое мнение — это ваше право

Powered by POEM™ Engine Copyright © 2002-2005