Здравствуйте, samius, Вы писали:
S>>>А вот если поковыряться в википедии, то выяснится что термин "замыкание" при упоминаниии вложенных процедур паскаля (с его рождения) ты употребил совершенно напрасно. Говорить о замыканиях в паскале можно лишь с поздних версий. И то это будет уже не паскаль, а делфи.
I>>Турбопаскаль уже считать дельфи или еще нет ? S>Вообще-то нет. Да и в делфи замыкания появились лишь в 2009-м. Так что без разницы, чем ты будешь считать турбопаскаль.
Вот они, замыкания, в олдскульном турбопаскале которому до дельфи еще много лет
program test;
uses crt;
procedure X(s:string);
procedure X1;
begin;
WriteLn('X1');
WriteLn(s);
end;
begin;
WriteLn('X(s:string)');
X1;
end;
begin
ClrScr;
X('test');
end.
вывод
X(s:string)
X1
test
И это, кстати, далеко не всё. наприме в этом турбопаскале можно сделать так
var p:procedure(s:string);
и использовать
p(''); {разработчики посчитали что это too big gun, потому инициализация делается с помощью InLine, по простому p := @X написать не получится.}
Вобщем как ты видишь, Pascal поддерживает замыкания а если на уровне библиотеки то и вовсе ФП
Здравствуйте, Ikemefula, Вы писали:
I>Здравствуйте, samius, Вы писали:
I>>>Турбопаскаль уже считать дельфи или еще нет ? S>>Вообще-то нет. Да и в делфи замыкания появились лишь в 2009-м. Так что без разницы, чем ты будешь считать турбопаскаль.
I>Вот они, замыкания, в олдскульном турбопаскале которому до дельфи еще много лет
Это не замыкание, это вложенная процедура.
I>Вобщем как ты видишь, Pascal поддерживает замыкания а если на уровне библиотеки то и вовсе ФП
Как я вижу, не поддерживает.
Здравствуйте, samius, Вы писали:
I>>Вот они, замыкания, в олдскульном турбопаскале которому до дельфи еще много лет S>Это не замыкание, это вложенная процедура.
Это именно замыкание, а то про что ты говорил в дельфях, это анонимные функции.
Здравствуйте, Ikemefula, Вы писали:
I>Здравствуйте, samius, Вы писали:
I>>>Вот они, замыкания, в олдскульном турбопаскале которому до дельфи еще много лет S>>Это не замыкание, это вложенная процедура.
I>Это именно замыкание, а то про что ты говорил в дельфях, это анонимные функции.
Ты ошибаешься
Здравствуйте, samius, Вы писали:
I>>>>Вот они, замыкания, в олдскульном турбопаскале которому до дельфи еще много лет S>>>Это не замыкание, это вложенная процедура.
I>>Это именно замыкание, а то про что ты говорил в дельфях, это анонимные функции. S>Ты ошибаешься
Покажи недостающую разницу между замыканиями и локальными функциями.
Вот прямо в этой нити люди уже путают наследование интерфейсов с наследованием реализаций.
Читайте, читайте Design Patterns. Ибо если не прочтете — то будете обречены на самостоятельное интуитивное изобретение их же с годами опыта, конечно
Мыслим мы не объектами (Липперт, конечно, умнейший человек, судя по его комментам в книге Хейлсберга с соавторами, но таки уточню его мысль). Мыслим мы — _паттернами_. И каждый паттерн _зачем-то нужен_, а не _для красоты_.
Взять тот же синглетон. Случаи абъюза этого паттерна просто "для красоты" встречаются постоянно. Хотя у тех же GoF четко написано, зачем он нужен.
И тем не менее самая главная задача архитектуры кода не решается ни ООП, ни метапрограммированием, вообще никакой методологией, кроме вкуса, интуиции и опыта девелопера.
Выглядит она (в упрощенном виде) так: есть 2 похожие задачи, ну, процентов на 90. Писать ли для них две версии кода через копи/паст или включать анализ конкретных (а иногда экзотических) случаев в один и тот же код? понятно, что через if это делать — чудовищно, лучше воткнуть туда Strategy, но когда и как имеет смысл делать такое (да еще и с учетом роадмапа развития продукта и возможном появлении требований на новые фичи вот прям в этом месте) — это, извините, только интуиция.
Здравствуйте, Ikemefula, Вы писали:
I>Здравствуйте, samius, Вы писали:
I>>>>>Вот они, замыкания, в олдскульном турбопаскале которому до дельфи еще много лет S>>>>Это не замыкание, это вложенная процедура.
I>>>Это именно замыкание, а то про что ты говорил в дельфях, это анонимные функции. S>>Ты ошибаешься
I>Покажи недостающую разницу между замыканиями и локальными функциями.
В паскале вложенные функции.
Разница между замыканием и вложенной функции в том, что вложенная функция может быть вызвана лишь напрямую из внешней, т.к. ей нужен стек фрейм внешней функции. А замыкание продлевает время жизни связанного окружения до времени своего существования, которое не ограничено временем выполнения внешней функции.
Таким образом, пока паскаль располагал локальные переменные на стеке, его вложенные функции не могли считаться замыканиями.
Здравствуйте, samius, Вы писали:
I>>Покажи недостающую разницу между замыканиями и локальными функциями. S>В паскале вложенные функции. S>Разница между замыканием и вложенной функции в том, что вложенная функция может быть вызвана лишь напрямую из внешней, т.к. ей нужен стек фрейм внешней функции. А замыкание продлевает время жизни связанного окружения до времени своего существования, которое не ограничено временем выполнения внешней функции.
Ты смешиваешь разные понятия — первоклассные функции и замыкания.
Очевидно, в языке который умеет ПФ , замыкания так же должны поддерживать все сценарии для ПФ.
Если язык не поддерживает ПФ, то нет никакой необходимости поддерживать эти сценарии в замыканиях.
В дельфи 2009 появились именно ПФ, ага. Отсюда очевидно, что замыкания обязаны поддерживать эти сценарии.
Здравствуйте, Maxim S. Shatskih, Вы писали:
MSS>Мыслим мы не объектами (Липперт, конечно, умнейший человек, судя по его комментам в книге Хейлсберга с соавторами, но таки уточню его мысль). Мыслим мы — _паттернами_. И каждый паттерн _зачем-то нужен_, а не _для красоты_.
Здравствуйте, Ikemefula, Вы писали:
I>Здравствуйте, samius, Вы писали:
I>>>Покажи недостающую разницу между замыканиями и локальными функциями. S>>В паскале вложенные функции. S>>Разница между замыканием и вложенной функции в том, что вложенная функция может быть вызвана лишь напрямую из внешней, т.к. ей нужен стек фрейм внешней функции. А замыкание продлевает время жизни связанного окружения до времени своего существования, которое не ограничено временем выполнения внешней функции.
I>Ты смешиваешь разные понятия — первоклассные функции и замыкания.
Нет, не смешиваю. Это разные вещи. I>Очевидно, в языке который умеет ПФ , замыкания так же должны поддерживать все сценарии для ПФ.
Контрпример — ALGOL 68 I>Если язык не поддерживает ПФ, то нет никакой необходимости поддерживать эти сценарии в замыканиях.
Замыкание — это техника реализации определенного сценария. В паскале этот сценарий не был реализован до 2009-го года. I>В дельфи 2009 появились именно ПФ, ага. Отсюда очевидно, что замыкания обязаны поддерживать эти сценарии.
Нет, замыкания лишь способ. Обрати внимание на то что нет языков с замыканием но без возможности возврата функции в качестве результата. http://en.wikipedia.org/wiki/First-class_function#Language_support
Улыбнуло что это всего лишь в "некотором смысле" (как у vdimas-а):
In PascalLanguage and AlgolLanguage, a function can be passed as an argument to another function, but cannot be stored in a variable or data structure, cannot be returned from a function, and cannot be created without being given a name. However, when a function is passed to another function and later called, it will execute in the lexical context it was defined in, so it is, in some sense, "closed over" that context.
А тут даже поржал:
In response to someone's addition of Pascal and Algol to the language list, I added a paragraph about 'closures' in languages lacking first-class functions.
Здравствуйте, Ikemefula, Вы писали:
S>>Т.е. имеется в виду т.н. "сетевой эффект", да? I>Я не сильно понимаю этот термин.
Это в маркетинге — нелинейность спроса на товар, вызванная спросом на товар.
Типичный пример — скайп и ему подобные. Любой идиот может написать p2p чатилку; но интерес к ней напрямую зависит от количества уже вступивших туда участников.
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
MSS>>Мыслим мы не объектами (Липперт, конечно, умнейший человек, судя по его комментам в книге Хейлсберга с соавторами, но таки уточню его мысль). Мыслим мы — _паттернами_. И каждый паттерн _зачем-то нужен_, а не _для красоты_.
I>Что значит "мыслить паттернами" ?
Считать себя самым крутым в мире Синглтоном, а на самом деле быть Абстракт Фактори любого бреда и Итератором походов в туалет
Здравствуйте, Ikemefula, Вы писали:
I>Ты смешиваешь разные понятия — первоклассные функции и замыкания.
Чтобы разделить их, достаточно в турбопаскале вернуть из функции X указатель на вложенную в неё функцию X1. А потом попробовать вызвать это "замыкание".
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Здравствуйте, samius, Вы писали:
I>>Очевидно, в языке который умеет ПФ , замыкания так же должны поддерживать все сценарии для ПФ. S>Контрпример — ALGOL 68
Там тоже есть замыкания.
I>>Если язык не поддерживает ПФ, то нет никакой необходимости поддерживать эти сценарии в замыканиях. S>Замыкание — это техника реализации определенного сценария. В паскале этот сценарий не был реализован до 2009-го года. I>>В дельфи 2009 появились именно ПФ, ага. Отсюда очевидно, что замыкания обязаны поддерживать эти сценарии. S>Нет, замыкания лишь способ. Обрати внимание на то что нет языков с замыканием но без возможности возврата функции в качестве результата. S>http://en.wikipedia.org/wiki/First-class_function#Language_support
Здравствуйте, Sinclair, Вы писали:
I>>Ты смешиваешь разные понятия — первоклассные функции и замыкания. S>Чтобы разделить их, достаточно в турбопаскале вернуть из функции X указатель на вложенную в неё функцию X1. А потом попробовать вызвать это "замыкание".
В турбопаскале это делается только хаком. Там даже обычную не вложеную функцию нельзя просто так вызвать по указателю.
Здравствуйте, Ikemefula, Вы писали:
I>Здравствуйте, samius, Вы писали:
I>>>Очевидно, в языке который умеет ПФ , замыкания так же должны поддерживать все сценарии для ПФ. S>>Контрпример — ALGOL 68
I>Там тоже есть замыкания.
Интересно, а авторы в курсе?
S>>http://en.wikipedia.org/wiki/First-class_function#Language_support
I>Ты шота стал википедией злоупотреблять Если я отредактирую эту табличку, ты согласишься со мной ?
Нет, я смотрел и в других источниках тоже. А если поправишь табличку, там есть кому поправить обратно.
S>>То что ты называешь лексическим замыканием в паскале, всего лишь http://en.wikipedia.org/wiki/Lexically_scoped#Lexical_scoping, который распространяется на вложенные функции. Замыкание же позволяет использовать переменные ИЗВНЕ их lexical scope (http://en.wikipedia.org/wiki/Closure_%28computer_science%29)
I>Это вообще не аргумент, см выше
Конечно, а у тебя аргумент, притом что автор той странички не знает, кто добавил паскаль в список языков с замыканиями. Удивительной убедительности аргумент.
S>>Соответственно, раз нет возможности пользоваться переменными извне их lexical scope, то о чем говорить?
I>Как минимум если нет такой возможности то в принципе невозможно различить.
I>Вобщем твое мнение мне понятно и я считаю его ошибочным, можешь отдыхать.
Окей, то что ты мое мнение считаешь ошибочным для меня не проблема. Отдохну от тебя с удовольствием.
Здравствуйте, samius, Вы писали:
S>>>Контрпример — ALGOL 68
I>>Там тоже есть замыкания. S>Интересно, а авторы в курсе?
Позвони да узнай.
I>>Ты шота стал википедией злоупотреблять Если я отредактирую эту табличку, ты согласишься со мной ? S>Нет, я смотрел и в других источниках тоже. А если поправишь табличку, там есть кому поправить обратно.
похоже, "другие источники" еще более ушлые чем википедия
I>>Это вообще не аргумент, см выше S>Конечно, а у тебя аргумент, притом что автор той странички не знает, кто добавил паскаль в список языков с замыканиями. Удивительной убедительности аргумент.
Ну это ж не я ссылаюсь на википедию
I>>Как минимум если нет такой возможности то в принципе невозможно различить.
I>>Вобщем твое мнение мне понятно и я считаю его ошибочным, можешь отдыхать. S>Окей, то что ты мое мнение считаешь ошибочным для меня не проблема. Отдохну от тебя с удовольствием.
Здравствуйте, Ikemefula, Вы писали:
I>Здравствуйте, samius, Вы писали:
S>>Нет, я смотрел и в других источниках тоже. А если поправишь табличку, там есть кому поправить обратно.
I>похоже, "другие источники" еще более ушлые чем википедия
Похоже что кроме дискредитации источников, тебе нечем возразить.
S>>Конечно, а у тебя аргумент, притом что автор той странички не знает, кто добавил паскаль в список языков с замыканиями. Удивительной убедительности аргумент.
I>Ну это ж не я ссылаюсь на википедию
А на кого ты ссылаешься, можно узнать?
Здравствуйте, samius, Вы писали:
S>>>Контрпример — ALGOL 68 I>>Там тоже есть замыкания. S>Интересно, а авторы в курсе?
Насколько я знаю, стандарт не обязывает реализовывать замыкания. Т.е. решение upwards funarg problem не требуется. При том, что все что нужно для полноценных замыканий (включая GC) в Algol 68 есть. Видимо поэтому, в некоторых реализациях 70-х замыкания были, но не во всех. В той реализации (современной), которой я проверял этот код
Здравствуйте, Klapaucius, Вы писали:
K>Здравствуйте, samius, Вы писали:
S>>>>Контрпример — ALGOL 68 I>>>Там тоже есть замыкания. S>>Интересно, а авторы в курсе?
K>Насколько я знаю, стандарт не обязывает реализовывать замыкания. Т.е. решение upwards funarg problem не требуется. При том, что все что нужно для полноценных замыканий (включая GC) в Algol 68 есть. Видимо поэтому, в некоторых реализациях 70-х замыкания были, но не во всех. В той реализации (современной), которой я проверял этот код
Я просто посмотрел в табличку на википедии (и не только, еще и на haskell.org, где-то еще). Ikemefula походу принимает за замыкание решение низходящего фунарга.