Здравствуйте, Ikemefula, Вы писали:
I>В турбопаскале это делается только хаком. Там даже обычную не вложеную функцию нельзя просто так вызвать по указателю.
Да? А в инструкциипишут что вроде можно.
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Здравствуйте, samius, Вы писали:
I>>похоже, "другие источники" еще более ушлые чем википедия S>Похоже что кроме дискредитации источников, тебе нечем возразить.
Кроме фразы "другие источники" и википедии у тебя ничего не было.
S>>>Конечно, а у тебя аргумент, притом что автор той странички не знает, кто добавил паскаль в список языков с замыканиями. Удивительной убедительности аргумент.
I>>Ну это ж не я ссылаюсь на википедию S>А на кого ты ссылаешься, можно узнать?
Надо понимать, по моей ссылке ты не ходил или ходил но прочесть не смог или прочел но не понял ?
Здравствуйте, Ikemefula, Вы писали:
I>Здравствуйте, samius, Вы писали:
I>Кроме фразы "другие источники" и википедии у тебя ничего не было.
Это свидетельствует о проблемах с вниманием у тебя.
S>>А на кого ты ссылаешься, можно узнать?
I>Надо понимать, по моей ссылке ты не ходил или ходил но прочесть не смог или прочел но не понял ?
Я даже процитировал что автор не знает откуда взялась информация. Но ты не отразил это трижды.
Здравствуйте, Sinclair, Вы писали:
I>>В турбопаскале это делается только хаком. Там даже обычную не вложеную функцию нельзя просто так вызвать по указателю. S>Да? А в инструкциипишут что вроде можно.
Ожидаю от тебя пример вроде того что ниже, но только что бы он хотя бы компилился
type
pProc = procedure(s:string);
function X(s:string):pProc;far;
procedure X1;far;
begin;
WriteLn(s);
end;
begin;
X := @X1;
end;
Ну и мануал, там есть подсказка
@ and Procedures and Functions
When the @ address-of operator is placed before a procedure or function,
it returns the address of the procedure or function's entry point. This form
is used for passing a procedure or function location to an assembly language
routine, or to save a pointer to a procedure. For example, given
var
ProcPointer : Pointer;
function Sum(A, B: Integer) : Integer;
...
ProcPointer := @Sum;
assigns ProcPointer the address of function Sum.
Listing 3.4 illustrates the use of the @ symbol for passing a pointer to a
procedure as a procedure parameter. This example uses the TCollection
object-oriented library method ForEach, which takes as its only a parameter, a
pointer to a procedure. ForEach is defined as,
procedure ForEach (Action: Pointer);
ForEach calls the procedure parameter using code that resembles,
Listing 3.4. A sample procedure that uses the @ address-of operator on a
procedure.
procedure PrintPhoneBook;
procedure PrintEntry( OneEntry : PPersonInfo ); far;
begin
with OneEntry^ do
Writeln(Name,Address,City,State,Zip,Age);
end; { PrintEntry }
Здравствуйте, samius, Вы писали:
I>>Кроме фразы "другие источники" и википедии у тебя ничего не было. S>Это свидетельствует о проблемах с вниманием у тебя.
Три-четыре ссылки на википедию это и есть "другие источники" ? И давно у тебя так ?
S>>>А на кого ты ссылаешься, можно узнать?
I>>Надо понимать, по моей ссылке ты не ходил или ходил но прочесть не смог или прочел но не понял ? S>Я даже процитировал что автор не знает откуда взялась информация. Но ты не отразил это трижды.
Не собираюсь твою вольную трактовку вольного перевода с английского языка, ибо смысла это не имеет, судя по предыдущим беседам, нпример как ты трактовал определение идентити.
Здравствуйте, Ikemefula, Вы писали:
I>Здравствуйте, samius, Вы писали:
I>>>Кроме фразы "другие источники" и википедии у тебя ничего не было. S>>Это свидетельствует о проблемах с вниманием у тебя.
I>Три-четыре ссылки на википедию это и есть "другие источники" ? И давно у тебя так ?
Ой как жопа завиляла... Чую подмену темы. Я не выдавал википедию за другие источники.
S>>>>А на кого ты ссылаешься, можно узнать?
I>>>Надо понимать, по моей ссылке ты не ходил или ходил но прочесть не смог или прочел но не понял ? S>>Я даже процитировал что автор не знает откуда взялась информация. Но ты не отразил это трижды.
I>Не собираюсь твою вольную трактовку вольного перевода с английского языка, ибо смысла это не имеет, судя по предыдущим беседам, нпример как ты трактовал определение идентити.
Именно поэтому я твоему источнику должен верить больше чем википедии и "другим источникам", которые я не упоминал?
Рассчитываю на то, что если у тебя найдется другая причина, то ты ее предъявишь. Иначе обсуждать тут кто что не понял я больше не собираюсь.
Кхм... вложенная функция это свой отдельный scope, если вообще про область видимости можно такое сказать. Который можно сказать включает scope вышестоящего уровня.
Так же и во вложенной функции позволительно использовать переменные вышестоящего scope.
Внешние отличия чисто косметические. Внутренняя реализация конечно другая. Хотя строго говоря вложенные функции это не замыкания (технически и формально), но называть их замыканиями вполне можно, хотя путать их тоже нельзя. Это просто другая реализация с тем же смыслом и теми же целями. Там называлась так, здесь называется по другому, но это одно и то же.
Здравствуйте, samius, Вы писали:
I>>>>Кроме фразы "другие источники" и википедии у тебя ничего не было. S>>>Это свидетельствует о проблемах с вниманием у тебя.
I>>Три-четыре ссылки на википедию это и есть "другие источники" ? И давно у тебя так ? S>Ой как жопа завиляла... Чую подмену темы. Я не выдавал википедию за другие источники.
"Кроме фразы "другие источники" и википедии у тебя ничего не было" @
Попроси модераторов отредактировать твои сообщения и всунуть туда какую ссылку кроме как на википедию и будем считать это твоей победой
I>>Не собираюсь твою вольную трактовку вольного перевода с английского языка, ибо смысла это не имеет, судя по предыдущим беседам, нпример как ты трактовал определение идентити. S>Именно поэтому я твоему источнику должен верить больше чем википедии и "другим источникам", которые я не упоминал?
То есть, не упоминал, значит с моим вниманием все в порядке ?
S>Рассчитываю на то, что если у тебя найдется другая причина, то ты ее предъявишь. Иначе обсуждать тут кто что не понял я больше не собираюсь.
Не беспокойся, я тебя пойму, если не станешь писать ответ.
Здравствуйте, samius, Вы писали:
S>Я просто посмотрел в табличку на википедии (и не только, еще и на haskell.org, где-то еще). Ikemefula походу принимает за замыкание решение низходящего фунарга.
Я походу объяснил, что в паскале как минимум нет возможности различить два случая пользуюясь легальными средствами языка. Одна и та же фича для поддержки языковых средств.
Объясни, для чего в языке, который не умеет первоклассные функции, реализовывать полноценные замыкания ? Рассматривай это как оптимизацию.
Здравствуйте, Ikemefula, Вы писали:
I>Здравствуйте, samius, Вы писали:
S>>Я просто посмотрел в табличку на википедии (и не только, еще и на haskell.org, где-то еще). Ikemefula походу принимает за замыкание решение низходящего фунарга.
I>Я походу объяснил, что в паскале как минимум нет возможности различить два случая пользуюясь легальными средствами языка. Одна и та же фича для поддержки языковых средств.
I>Объясни, для чего в языке, который не умеет первоклассные функции, реализовывать полноценные замыкания ? Рассматривай это как оптимизацию.
Вот и википедия говорит что в паскале замыканий нет в том числе потому что нет первоклассных функций. В этом свете я не понимаю, что ты хочешь что бы я тебе объяснил.
Здравствуйте, samius, Вы писали:
I>>Я походу объяснил, что в паскале как минимум нет возможности различить два случая пользуюясь легальными средствами языка. Одна и та же фича для поддержки языковых средств.
I>>Объясни, для чего в языке, который не умеет первоклассные функции, реализовывать полноценные замыкания ? Рассматривай это как оптимизацию. S>Вот и википедия говорит что в паскале замыканий нет в том числе потому что нет первоклассных функций. В этом свете я не понимаю, что ты хочешь что бы я тебе объяснил.
на вопрос "для чего" ответил "Вот и википедия...", вобщем до свидания
Здравствуйте, grosborn, Вы писали:
>> S>>То что ты называешь лексическим замыканием в паскале, всего лишь http://en.wikipedia.org/wiki/Lexically_scoped#Lexical_scoping, который распространяется на вложенные функции.
G>Кхм... вложенная функция это свой отдельный scope, если вообще про область видимости можно такое сказать. Который можно сказать включает scope вышестоящего уровня.
Верно, включает, в этом и отличие.
>> Замыкание же позволяет использовать переменные ИЗВНЕ их lexical scope (http://en.wikipedia.org/wiki/Closure_%28computer_science%29)
G>Так же и во вложенной функции позволительно использовать переменные вышестоящего scope.
Использовать переменные вышестоящего scope это не есть замыкание. Пресловутая википедия говорит:
In programming language theory, a non-local variable is a variable that is not defined in the local scope.
Раз переменные внешней функции определены для вложенной функции, значит они локальны для вложенной по этому определению. А по определению замыкания с той же википедии, замыканием считается функция, позволяющая работать с нелокальными переменными. Т.е. вложенная функция паскаля не является замыканием по определению с википедии (точнее по совокупности их).
G>Внешние отличия чисто косметические. Внутренняя реализация конечно другая. Хотя строго говоря вложенные функции это не замыкания (технически и формально), но называть их замыканиями вполне можно, хотя путать их тоже нельзя. Это просто другая реализация с тем же смыслом и теми же целями. Там называлась так, здесь называется по другому, но это одно и то же.
Замыкание — это в основном и есть способ реализации, который отличается от способа реализации через передачу указателя на фрейм стека. Именно потому и отличия в возможностях.
Способ реализации "замыкание" в полный рост может использоваться и для вызовов вложенных функций внутри вложенной (т.е. без передачи вложенной функции наверх). Но это лишь потому, что некоторым компиляторам лень разбираться, в каком контексте будет вызываться вложенная функция. Так, например C# не разбирается и использует замыкание(т.е. технику реализации) даже там где передавать вложенную функцию вовне не надо, а можно было бы обойтись указателем на фрейм стека. Просто использовать замыкание дешевле в плане необходимости модифицировать рантайм. Возможно отсюда и путаница, что раз паскаль позволяет делать то, что позволяют замыкания в C# (но лишь во внутреннюю сторону, неестественную для замыканий), то типа и паскаль значит поддерживает замыкания. Но нет, не поддерживает по определению замыкания и нелокальной переменной.
Здравствуйте, samius, Вы писали:
S>Раз переменные внешней функции определены для вложенной функции, значит они локальны для вложенной по этому определению. А по определению замыкания с той же википедии, замыканием считается функция, позволяющая работать с нелокальными переменными. Т.е. вложенная функция паскаля не является замыканием по определению с википедии (точнее по совокупности их).
Википедия, википедия, википедия... Кстати, там же "A closure allows a function to access variables outside its immediate lexical scope". Что такое immediate lexical scope ?
S>Способ реализации "замыкание" в полный рост может использоваться и для вызовов вложенных функций внутри вложенной (т.е. без передачи вложенной функции наверх). Но это лишь потому, что некоторым компиляторам лень разбираться, в каком контексте будет вызываться вложенная функция. Так, например C# не разбирается и использует замыкание(т.е. технику реализации) даже там где передавать вложенную функцию вовне не надо, а можно было бы обойтись указателем на фрейм стека. Просто использовать замыкание дешевле в плане необходимости модифицировать рантайм. Возможно отсюда и путаница, что раз паскаль позволяет делать то, что позволяют замыкания в C# (но лишь во внутреннюю сторону, неестественную для замыканий), то типа и паскаль значит поддерживает замыкания. Но нет, не поддерживает по определению замыкания и нелокальной переменной.
Способ реализации ? Сильный аргумент — эдак окажется что ни в одном языке нет замыканий.
> G>Так же и во вложенной функции позволительно использовать переменные вышестоящего scope. > Использовать переменные вышестоящего scope это не есть замыкание.
Это ты сам только что придумал.
> Пресловутая википедия говорит: >
> In programming language theory, a non-local variable is a variable that is not defined in the local scope.
Ну так верь википедии, что же ты ересь-то несешь. Отлучат тебя от вики.
> Раз переменные внешней функции определены для вложенной функции, значит они локальны для вложенной по этому определению.
Ничего подобного. По определению переменные вышестоящей процедуры это не локальные для вложенной переменные. У вложенной процедуры/функции своя область видимости, для нее вышестоящая процедура/функция это не локальная, а внешняя, и обращается она к переменным вышестоящей процедуры/функции технически так же, как и замыкание, то есть через относительную ссылку. Вложенные процедуры имеют пересекающиеся scop-ы.
> А по определению замыкания с той же википедии, замыканием считается функция, позволяющая работать с нелокальными переменными.
Ну так верь ей. Значит процедуры паскаля — замыкания. По определению
> Т.е. вложенная функция паскаля не является замыканием по определению с википедии (точнее по совокупности их).
А это ты сам придумал.
> Способ реализации "замыкание" в полный рост может использоваться и для вызовов вложенных функций внутри вложенной (т.е. без передачи вложенной функции наверх). Но это лишь потому, что некоторым компиляторам лень разбираться, в каком контексте будет вызываться вложенная функция. Так, например C# не разбирается и использует замыкание(т.е. технику реализации) даже там где передавать вложенную функцию вовне не надо, а можно было бы обойтись указателем на фрейм стека. Просто использовать замыкание дешевле в плане необходимости модифицировать рантайм.
Лень тут совершенно не при чем. J или C# это не стековая машина, как паскаль, данные не на стеке, отсюда (ну и не только) и различия в реализации.
> Возможно отсюда и путаница, что раз паскаль позволяет делать то, что позволяют замыкания в C# (но лишь во внутреннюю сторону, неестественную для замыканий), то типа и паскаль значит поддерживает замыкания. Но нет, не поддерживает по определению замыкания и нелокальной переменной.
Вложенные процедуры это замыкания "по определению", как тут путаница? Все предельно ясно.
Здравствуйте, Ikemefula, Вы писали:
I>Здравствуйте, samius, Вы писали:
I>Википедия, википедия, википедия... Кстати, там же "A closure allows a function to access variables outside its immediate lexical scope". Что такое immediate lexical scope ?
Что-то ты не можешь со мной распрощаться. Пока-пока!
Здравствуйте, grosborn, Вы писали:
>> G>Так же и во вложенной функции позволительно использовать переменные вышестоящего scope. >> Использовать переменные вышестоящего scope это не есть замыкание.
G>Это ты сам только что придумал.
>> Пресловутая википедия говорит: >>
>> In programming language theory, a non-local variable is a variable that is not defined in the local scope.
G>Ну так верь википедии, что же ты ересь-то несешь. Отлучат тебя от вики.
В таком русле разговор не сложится.
Ты хочешь сказать что в scope вложенной функции переменные внешней не определены? Если да, не определены, то можно не продолжать.
> Ты хочешь сказать что в scope вложенной функции переменные внешней не определены? Если да, не определены, то можно не продолжать.
В scope вообще переменные не определяются. Локальные переменные определяются в блоке, а scope это область видимости. Если мы в какой-то процедуре что-то видим, оно не становится локальным. Глобальные переменные не становятся локальными.
Здравствуйте, grosborn, Вы писали:
>> Ты хочешь сказать что в scope вложенной функции переменные внешней не определены? Если да, не определены, то можно не продолжать.
G>В scope вообще переменные не определяются. Локальные переменные определяются в блоке, а scope это область видимости. Если мы в какой-то процедуре что-то видим, оно не становится локальным. Глобальные переменные не становятся локальными.
Давай сначала закроем тему с глобальными переменными, ведь мы говорим не о них.
Опять википедия
In computer programming, a global variable is a variable that is accessible in every scope (unless shadowed).
In computer science, a local variable is a variable that is given local scope.
In programming language theory, a non-local variable is a variable that is not defined in the local scope.
a scope is the context within a computer program in which a variable name or other identifier is valid and can be used, or within which a declaration has effect.
Так вот, глядя на эти определения и ничего не выдумывая, можешь ли ты ответить, как классифицируются переменные внешней функции относительно вложенной?
Если переменной дается local scope (т.е. не глобальный), и этот scope распространяется на вложенную функцию, то согласно этим определениям будет ли переменная внешней функции локальна для внутренней или нет?
S>Давай сначала закроем тему с глобальными переменными, ведь мы говорим не о них.
Чтобы дискуссия была продуктивной стоит выделить и отделить друг от друга следующие понятия:
а) видимость переменной
b) время жизни переменной
c) "время жизни" вызова функции
Сейчас при аргументации постоянно происходит подмена одного понятия на другое, и соответственно передергивание терминов глобальный, локальный и т.д.
> Сейчас при аргументации постоянно происходит подмена одного понятия на другое, и соответственно передергивание терминов глобальный, локальный и т.д.
Нет, спасибо, не надо тут подмены понятий пожалуйста. Я понимаю ты в этом силен, но тут очень простой вопрос и не стоит из него высасывать тред на сотню постов.