Автор Тема: Замыкания  (Прочитано 13303 раз)

ilovb

  • Hero Member
  • *****
  • Сообщений: 2538
  • just another nazi test
    • Просмотр профиля
    • Oberon systems
Re: Замыкания
« Ответ #15 : Май 11, 2012, 04:45:55 pm »
Э... зачем? Все элементы - наследники какого-нибудь Object и вперед.
Т.е. коллекция разнородная? Разнородная в том смысле, что их нельзя сравнить по базе (Object)?
Тогда что за чудо метод у объекта context, который умеет яблоки с холодильниками сравнивать?
Или тут еще поддержка обобщенки нужна?

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

Тут в принципе согласен. С перегрузкой трудоемко будет...

vlad

  • Hero Member
  • *****
  • Сообщений: 1391
    • Просмотр профиля
Re: Замыкания
« Ответ #16 : Май 11, 2012, 04:51:43 pm »
Ну в паскалях например так не напишешь.

Об чем и речь ;) В паскалях нет замыканий. В дельфях есть очень ограниченная поддержка - там "замыкается" указатель на объект так, что в рассмотренную функцию sort можно отдавать метод объекта (а в объекте уже может лежать нужный контекст).

Это ведь не фича замыкания, а фича самого языка.

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

Я про то, что в данном примере этот х явно в месте вызова записан.

Ну да. Но при этом 'x' скрыт от реализации ConvertAll. PROFIT! :)

vlad

  • Hero Member
  • *****
  • Сообщений: 1391
    • Просмотр профиля
Re: Замыкания
« Ответ #17 : Май 11, 2012, 04:56:41 pm »
Э... зачем? Все элементы - наследники какого-нибудь Object и вперед.
Т.е. коллекция разнородная? Разнородная в том смысле, что их нельзя сравнить по базе (Object)?

Она может быть однородная. Все яблоки. Все наследники Object.

Тогда что за чудо метод у объекта context, который умеет яблоки с холодильниками сравнивать?
Или тут еще поддержка обобщенки нужна?

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

ilovb

  • Hero Member
  • *****
  • Сообщений: 2538
  • just another nazi test
    • Просмотр профиля
    • Oberon systems
Re: Замыкания
« Ответ #18 : Май 11, 2012, 05:01:04 pm »
Цитата: vlad
Об чем и речь  В паскалях нет замыканий. В дельфях есть очень ограниченная поддержка - там "замыкается" указатель на объект так, что в рассмотренную функцию sort можно отдавать метод объекта (а в объекте уже может лежать нужный контекст).
...Вот это самая фича языка и называется "поддержка замыканий". Создатели языка могут обозвать, углубить и расширить ее как угодно.

Уфф. Все, теперь я понял.  :)

Я то на классическое определение опирался:
Цитировать
Замыкание — это особый вид функции. Она определена в теле другой функции и создаётся каждый раз во время её выполнения. В записи это выглядит как функция, находящаяся целиком в теле другой функции. При этом вложенная внутренняя функция содержит ссылки на локальные переменные внешней функции. Каждый раз при выполнении внешней функции происходит создание нового экземпляра внутренней функции, с новыми ссылками на переменные внешней функции.

И пытался понять смысл именно как если бы разрешить в паскале возвращать вложенную функцию с сохранением контекста. А с такой формой записи как в додиезе, ясен перец удобно.  :)

ilovb

  • Hero Member
  • *****
  • Сообщений: 2538
  • just another nazi test
    • Просмотр профиля
    • Oberon systems
Re: Замыкания
« Ответ #19 : Май 11, 2012, 08:32:11 pm »
int[] ary = { 1, 2, 3 };
 int x = 2;
 var ary1 = Array.ConvertAll<int, int>(ary, delegate(int elem) { return elem * x; }); // { 2, 4, 6 }
 // or..
 var ary2 = Array.ConvertAll<int, int>(ary, elem => { return elem * x; }); // { 2, 4, 6 }
Но тут профит мне кажется больше в анонимности делегата, чем собственно в замыкании.
Конкретно профит в том, что можно так написать: "{ return elem * x; }"

Поясню, почему я так сказал  :)

Переписал этот пример на КП:
наша либа:
MODULE MyLib;
IMPORT Log;
TYPE
Op* = EXTENSIBLE RECORD END;
Arr = ARRAY OF INTEGER;

PROCEDURE (VAR o: Op) Calc*(VAR x: INTEGER), NEW, EMPTY;

PROCEDURE ConvertAll*(VAR a: Arr; VAR o: Op);
VAR i: INTEGER;
BEGIN
FOR i := 1 TO LEN(a) - 1 DO
o.Calc(a[i]);
END;
END ConvertAll;

PROCEDURE Print*(IN a: Arr);
VAR i: INTEGER;
BEGIN
FOR i := 1 TO LEN(a) -1 DO
Log.Int(a[i]);
END;
END Print;

BEGIN
END MyLib.

наш код:
Цитировать
MODULE MyTest;
   IMPORT Log, Lib := MyLib;
   TYPE
      Mul = RECORD(Lib.Op) y: INTEGER END;
   
   PROCEDURE (VAR m: Mul) Calc(VAR x: INTEGER);
   BEGIN
      x := x * m.y;
   END Calc;

   
   PROCEDURE Do*;
   VAR
      mul: Mul;
      a: ARRAY 10 OF INTEGER;
      j: INTEGER;
   BEGIN
      
      FOR j := 1 TO 9 DO
         a[j] := j;
      END;
      
      mul.y := 10;
      
      Lib.ConvertAll(a, mul);
      
      Lib.Print(a);
      
   END Do;   
   
BEGIN
END MyTest.Do

Жирным выделил цену вопроса.

Т.е. додиезовский пример отличается только формой записи.

ilovb

  • Hero Member
  • *****
  • Сообщений: 2538
  • just another nazi test
    • Просмотр профиля
    • Oberon systems
Re: Замыкания
« Ответ #20 : Май 11, 2012, 08:44:54 pm »
И мне еще одна вещь в замыканиях осталась непонятной:
Вот в примере на КП например все понятно с памятью. А как замыкания память выделяют/освобождают совершенно не ясно.

А вот этот вариант в плане освобождения памяти для меня вообще загадка:
function counter()
{
   var num = 0;
   return function()
   {
      return ++num;
   }
}

var c = counter();

c(); //1
c(); //2
c(); //3

Их GC собирает потом?

ilovb

  • Hero Member
  • *****
  • Сообщений: 2538
  • just another nazi test
    • Просмотр профиля
    • Oberon systems
Re: Замыкания
« Ответ #21 : Май 11, 2012, 09:00:36 pm »
В дельфях есть очень ограниченная поддержка - там "замыкается" указатель на объект так, что в рассмотренную функцию sort можно отдавать метод объекта (а в объекте уже может лежать нужный контекст)

Это типа как делегаты в ActiveOberon?

vlad

  • Hero Member
  • *****
  • Сообщений: 1391
    • Просмотр профиля
Re: Замыкания
« Ответ #22 : Май 11, 2012, 09:23:15 pm »
И мне еще одна вещь в замыканиях осталась непонятной:
Вот в примере на КП например все понятно с памятью. А как замыкания память выделяют/освобождают совершенно не ясно.

GC все делает. В принципе можно и без GC (в С++ есть реализация замыканий), но уже заморочней.

ilovb

  • Hero Member
  • *****
  • Сообщений: 2538
  • just another nazi test
    • Просмотр профиля
    • Oberon systems
Re: Замыкания
« Ответ #23 : Май 12, 2012, 06:40:18 am »
Переписал этот пример на КП:

Правда тут будут некоторые накладные расходы на вызов метода. С делегатами было бы совсем гуд.

Губанов Сергей Юрьевич

  • Hero Member
  • *****
  • Сообщений: 590
    • Просмотр профиля
    • Домашняя страница
Re: Замыкания
« Ответ #24 : Май 12, 2012, 08:52:58 am »
Правда тут будут некоторые накладные расходы на вызов метода. С делегатами было бы совсем гуд.
Если речь о дотнетных делегатах, то они тоже громоздкие и тормозные. Гуд был бы с простым указателем на статическую процедуру + указатель на this-объект.

ilovb

  • Hero Member
  • *****
  • Сообщений: 2538
  • just another nazi test
    • Просмотр профиля
    • Oberon systems
Re: Замыкания
« Ответ #25 : Май 12, 2012, 09:01:58 am »
Гуд был бы с простым указателем на статическую процедуру + указатель на this-объект.
Я вот такие и имел ввиду. В ActveOberon делегаты вроде так и сделаны.

ilovb

  • Hero Member
  • *****
  • Сообщений: 2538
  • just another nazi test
    • Просмотр профиля
    • Oberon systems
Re: Замыкания
« Ответ #26 : Май 12, 2012, 07:32:37 pm »
Так и думал, что эффективно это фиг сделаешь:
Фунарги

Geniepro

  • Hero Member
  • *****
  • Сообщений: 1955
  • Знайте- истина в том, что повторено трижды подряд!
    • Просмотр профиля
Re: Замыкания
« Ответ #27 : Май 14, 2012, 08:13:05 am »
Я правильно понимаю, что если язык с ООП, то замыкания не нужны?

Ну т.е. мне не понятно нафиг его везде пихают.

Самый ТРУъ-ООП язык -- это смоллток, а там все эти циклы и ветвления как раз на замыканиях сделаны...
to iterate is human, to recurse, divine

Салат «рекурсия»: помидоры, огурцы, салат…

valexey

  • Administrator
  • Hero Member
  • *****
  • Сообщений: 1990
    • Просмотр профиля
Re: Замыкания
« Ответ #28 : Май 14, 2012, 08:17:54 am »
Я правильно понимаю, что если язык с ООП, то замыкания не нужны?

Ну т.е. мне не понятно нафиг его везде пихают.

Самый ТРУъ-ООП язык -- это смоллток, а там все эти циклы и ветвления как раз на замыканиях сделаны...
Погоди. Как цикл через замыкание - понимаю, но ветвление (if) то как?
"но сейчас, чтобы компенсировать растущую мощность компьютеров, программисты используют фреймворки"

Geniepro

  • Hero Member
  • *****
  • Сообщений: 1955
  • Знайте- истина в том, что повторено трижды подряд!
    • Просмотр профиля
Re: Замыкания
« Ответ #29 : Май 14, 2012, 08:26:18 am »
Погоди. Как цикл через замыкание - понимаю, но ветвление (if) то как?
Точно так же, только в случае с ветвлением будет не одно замыкание, а два (then-ветка и else-ветка)...
to iterate is human, to recurse, divine

Салат «рекурсия»: помидоры, огурцы, салат…