ЗЫ: чтоб тебе, как сишнику, понятнее было: в случае, когда функция возвращает просто лямбду, не ссылающуюся на свободные переменные, то это то же, о чём ты говорил - просто указатель на функцию. Это можно в любом языке с вложенными функциями использовать. Однако, если возвращаемая лямбда ссылается на переменные, существующие во внешнем окружении (как в нашем случае x), то это будет представленно в виде пары: environment, содержащий значение x, и указатель на функцию, получающую в качестве аргументов сам environment и её аргумент y.
Это аналогично объекту с единственным методом и полями, содержащими захваченное окружение.
В общем, учись. И не говори глупости с таким апломбом. Или хотя бы стыдись после того, как такое сделаешь, и извиняйся перед публикой за то, что обманул ненамеренно.
> что в приведенном анонимусом примере не используется замыкание (closure)?
Я считаю, что в приведенном анонимусом примере используется closure. Но _я_ говорил (и даже ссылку проставил) о коде, который привел Legioner, и именно за эти слова получил титулы :) Если мне кто-нибудь объяснит, что там принципиально нельзя сделать на вложенных функциях Си - я буду признателен. Еще раз ссылка на код: http://www.linux.org.ru/jump-message.jsp?msgid=2831880&cid=2835704
> чтоб тебе, как сишнику, понятнее было: в случае, когда функция возвращает просто лямбду, не ссылающуюся на свободные переменные, то это то же, о чём ты говорил - просто указатель на функцию. Это можно в любом языке с вложенными функциями использовать. Однако, если возвращаемая лямбда ссылается на переменные, существующие во внешнем окружении (как в нашем случае x), то это будет представленно в виде пары: environment, содержащий значение x, и указатель на функцию, получающую в качестве аргументов сам environment и её аргумент y.
За объяснение - спасибо. Я не только сишник/плюсатый, но и питонист, так что то, что ты описал, я знаю и использую. Кстати, Схему почти в объеме SICP я тоже знаю.
> В общем, учись.
Симметрично. Только ты учи не CS, а просто учись читать внимательно.
> извиняйся перед публикой за то, что обманул ненамеренно.
> Я считаю, что в приведенном анонимусом примере используется closure.
Ты утверждал, что "в Схеме замыканий нет".
И ты не привёл кода на Си.
> что там принципиально нельзя сделать на вложенных функциях Си
Си - Тьюринг-полный язык. Принципиально на нём сделать можно всё.
Принципиально же нельзя заставить его создавать окружение замыкания неявным образом. То есть можно, коненчо же, но для этого потребуется препроцессор размером с половину компилятора Си.
Дурак ты, и не лечишься. Не способен ты признавать своих ошибок, а это самое гнилое качество, какое только может быть у человека.
Итак, замыкания в Схеме есть. Ничего подобного замыканиям в языках только с вложенными функциями нет. Всё. Остальное - за пределами этого обсуждения. Ты сказал глупость, и не имеешь сил этого признать.
Анонимуса, видимо, раззадорило предложение, которое он понял неверно:
>Кстати... может, я уже забыл Схему напрочь, но где там замыкания? Обычные вложенные функции.
Если меня не глючит, то в том коде, на который ты ссылаешься, замыкания все же есть (например, функция main). Можно ли это реализовать без замыканий и только на вложенных функциях -- хз :)
Думаю, большинство реализаций схемы не делают различий между замыканиями и вложенными функциями, т.к. по-моему, статическим анализом кода непросто определить, будет ли вызываться функция после завершения создавшей её функции (и разрушения стека, если там используется классический стек). Поэтому с "физической" точки зрения там, вероятно, будут обычные замыкания, захватывающие указатели на используемые внешние переменные. С другой стороны, по сути дела там обычные вложенные функции, которые обращаются к локальным переменным предыдущей по стеку функции. То же самое несложно сделать на обычном паскале (за исключением отсутствия гарантии оптимизации хвостовых вызовов).