> G>В scope вообще переменные не определяются. Локальные переменные определяются в блоке, а scope это область видимости. Если мы в какой-то процедуре что-то видим, оно не становится локальным. Глобальные переменные не становятся локальными. > > Давай сначала закроем тему с глобальными переменными, ведь мы говорим не о них.
> Так вот, глядя на эти определения и ничего не выдумывая, можешь ли ты ответить, как классифицируются переменные внешней функции относительно вложенной? > Если переменной дается local scope (т.е. не глобальный), и этот scope распространяется на вложенную функцию, то согласно этим определениям будет ли переменная внешней функции локальна для внутренней или нет?
Ошибочный тезис о том, что переменные из внешнего по отношению к исполняемому scope, внесенные каким-то механизмом в контекст исполнения становятся локальными, выдвинул ты. Я тебе его разрушил простым примером глобальных переменных. Кроме него есть и другие. Так что ты не крутись перебирая все ссылки википедии, а просто признай ошибочность тезиса.
Здравствуйте, Ikemefula, Вы писали: I>Ожидаю от тебя пример вроде того что ниже, но только что бы он хотя бы компилился
I>
I> type
I> pProc = procedure(s:string);
I> function X(s:string):pProc;far;
I> procedure X1;far;
I> begin;
I> WriteLn(s);
I> end;
I> begin;
I> X := @X1;
I> end;
I>
Отличный пример. А что мешает ему скомпилиться? Извини, у меня TP для проверки нету.
I>Ну и мануал, там есть подсказка
Ну вот в подсказке вроде очень похожий пример. Неужели TP умеет escape-analysis и запрещает передавать адреса вверх по стеку, разрешая вниз?
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Здравствуйте, grosborn, Вы писали:
>> Если переменной дается local scope (т.е. не глобальный), и этот scope распространяется на вложенную функцию, то согласно этим определениям будет ли переменная внешней функции локальна для внутренней или нет?
G>Ошибочный тезис о том, что переменные из внешнего по отношению к исполняемому scope, внесенные каким-то механизмом в контекст исполнения становятся локальными, выдвинул ты. Я тебе его разрушил простым примером глобальных переменных. Кроме него есть и другие. Так что ты не крутись перебирая все ссылки википедии, а просто признай ошибочность тезиса.
Ты разрушил не тезис, ты разрушил мое предположение о том что ты можешь работать с определениями. При том что мы будем пользоваться различными определениями/понятиями мы ни о чем не договоримся, а лишь потратим время.
Вобщем, если я в чем-то и ошибаюсь, то убедить меня в этом ты сможешь лишь вникнув в определения википедии, а не продавливая мнение что я ошибся, игнорируя что я пишу в ответ.
Ну или пообсуждать определение замыкания можно в другой системе определений, но непременно со ссылками на определения используемых понятий. Тогда тебе придется как минимум привести такую систему прежде чем гнобить википедию.
Если ты не готов, или не собираешься это делать, то тебе остается понять, что формально обсуждать образы в твоей голове контрпродуктивно.
Здравствуйте, grosborn, Вы писали:
>> Раз переменные внешней функции определены для вложенной функции, значит они локальны для вложенной по этому определению.
G>Ничего подобного. По определению переменные вышестоящей процедуры это не локальные для вложенной переменные. У вложенной процедуры/функции своя область видимости, для нее вышестоящая процедура/функция это не локальная, а внешняя, и обращается она к переменным вышестоящей процедуры/функции технически так же, как и замыкание, то есть через относительную ссылку.
Что такое "относительную ссылку"? Что такое "технически также"? Простите коллега, я вас совсем не понимаю.
G>Вложенные процедуры имеют пересекающиеся scop-ы.
О как. Я правильно понимаю, что в C++ фигурные скобочки — это уже замыкание???
void f(int parameter)
{
int a1 = parameter;
{
int a2 = a1; вот оно, наше замыкание. Так что ли?
}
сout << a1;
cout << a2;
}
G>Ну так верь ей. Значит процедуры паскаля — замыкания. По определению
У вас странное (для меня) понимание локальности. Но это, наверное, оттого, что я слишком много читаю Липперта.
G>А это ты сам придумал.
Профессионал должен уметь и размышлять, а не только цитировать авторитеты. Я с samius согласен.
G>Лень тут совершенно не при чем. J или C# это не стековая машина, как паскаль, данные не на стеке, отсюда (ну и не только) и различия в реализации.
Вот это новости! Куда делся стек? В прошлый раз, когда я читал ECMA-338, стек дотнета был на месте.
Коллега, вы меня пугаете! Можно пруфлинк в студию?
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
S>>Давай сначала закроем тему с глобальными переменными, ведь мы говорим не о них.
DG>Чтобы дискуссия была продуктивной стоит выделить и отделить друг от друга следующие понятия: DG>а) видимость переменной DG>b) время жизни переменной DG>c) "время жизни" вызова функции
DG>Сейчас при аргументации постоянно происходит подмена одного понятия на другое, и соответственно передергивание терминов глобальный, локальный и т.д.
Проблема дискуссии как раз в том что используются понятия и у каждого за конкретным термином понятие свое. И желания прийти к единой системе понятий я не наблюдаю. Без этого любая дискуссия имеет тенденцию превратиться в срач.
О чем можно дискутировать, если не договорились что называть локальной перменной? Какое уж тут ООП?
Здравствуйте, Sinclair, Вы писали:
S>Здравствуйте, grosborn, Вы писали:
>>> Раз переменные внешней функции определены для вложенной функции, значит они локальны для вложенной по этому определению.
G>>Ничего подобного. По определению переменные вышестоящей процедуры это не локальные для вложенной переменные. У вложенной процедуры/функции своя область видимости, для нее вышестоящая процедура/функция это не локальная, а внешняя, и обращается она к переменным вышестоящей процедуры/функции технически так же, как и замыкание, то есть через относительную ссылку. S>Что такое "относительную ссылку"? Что такое "технически также"? Простите коллега, я вас совсем не понимаю.
А мне показалось что я понял...
G>>Лень тут совершенно не при чем. J или C# это не стековая машина, как паскаль, данные не на стеке, отсюда (ну и не только) и различия в реализации. S>Вот это новости! Куда делся стек? В прошлый раз, когда я читал ECMA-338, стек дотнета был на месте.
Действительно. Как-то я это пропустил между ушей/глаз. Походу пора почистить stackoverflow.com от дотнета.
> G>Вложенные процедуры имеют пересекающиеся scop-ы. > О как. Я правильно понимаю, что в C++ фигурные скобочки — это уже замыкание???
Бу-га-га-га
> G>Ну так верь ей. Значит процедуры паскаля — замыкания. По определению > У вас странное (для меня) понимание локальности. Но это, наверное, оттого, что я слишком много читаю Липперта.
Еще и думать нужно.
> G>А это ты сам придумал. > Профессионал должен уметь и размышлять, а не только цитировать авторитеты. Я с samius согласен.
Бу-га-га-га, самиус как раз цитирует авторитеты и никогда не размышляет, не относится к формулировкам критически, относится строго формально вопреки логике. А тут формулировки википедии противоречат его позиции, вот ведь какая незадача случилась, попал в собственную ловушку.
> G>Лень тут совершенно не при чем. J или C# это не стековая машина, как паскаль, данные не на стеке, отсюда (ну и не только) и различия в реализации. > Вот это новости! Куда делся стек? В прошлый раз, когда я читал ECMA-338, стек дотнета был на месте. > Коллега, вы меня пугаете! Можно пруфлинк в студию?
Ты опять потроллить решил и перевираешь слова. В лес.
>>> Если переменной дается local scope (т.е. не глобальный), и этот scope распространяется на вложенную функцию, то согласно этим определениям будет ли переменная внешней функции локальна для внутренней или нет? > > G>Ошибочный тезис о том, что переменные из внешнего по отношению к исполняемому scope, внесенные каким-то механизмом в контекст исполнения становятся локальными, выдвинул ты. Я тебе его разрушил простым примером глобальных переменных. Кроме него есть и другие. Так что ты не крутись перебирая все ссылки википедии, а просто признай ошибочность тезиса. > Ты разрушил не тезис, ты разрушил мое предположение о том что ты можешь работать с определениями. При том что мы будем пользоваться различными определениями/понятиями мы ни о чем не договоримся, а лишь потратим время.
Не увиливай. Как не крутись, а переменная определенная в вышестоящей процедуре, во вложенной не локальная. У них и область видимости, то есть scope разные, и время жизни. С внешней не дотянуться до внутренней. Ну никак. Так что давай, садись на жопкой на горячую сковородку и признавай поражение.
> Вобщем, если я в чем-то и ошибаюсь, то убедить меня в этом ты сможешь лишь вникнув в определения википедии, а не продавливая мнение что я ошибся, игнорируя что я пишу в ответ.
Своей головой еще думать нужно.
> Ну или пообсуждать определение замыкания можно в другой системе определений, но непременно со ссылками на определения используемых понятий. Тогда тебе придется как минимум привести такую систему прежде чем гнобить википедию. > Если ты не готов, или не собираешься это делать, то тебе остается понять, что формально обсуждать образы в твоей голове контрпродуктивно.
> О чем можно дискутировать, если не договорились что называть локальной перменной? Какое уж тут ООП?
О чем можно дискутировать, если такие понятия вызывают трудность? Вообще бардак какой-то в голове у тебя, scope видите ли можно "назначать". Ты эта, давай с википедией завязывай и начинай читать учебники с ситематичным изложением материала. Потому что твой моск не выдержал шрапнели от комбинаторного взрыва, вызванного запоминанием большого количества статей википедии не объединенных в стройную систему пониманий.
Здравствуйте, grosborn, Вы писали:
G>Не увиливай. Как не крутись, а переменная определенная в вышестоящей процедуре, во вложенной не локальная.
Согласно определению — локальная. И ты пока не привел ничего, согласно чему можно было бы считать что она локальной не является.
G>У них и область видимости, то есть scope разные, и время жизни.
Действительно разные и я не утверждал обратного.
G>С внешней не дотянуться до внутренней. Ну никак. Так что давай, садись на жопкой на горячую сковородку и признавай поражение.
Поражение пока запишем за тобой, т.к. никакой аргументации твоим тезисам, кроме личной неприязни к википедии, ты не продемонстрировал.
>> Вобщем, если я в чем-то и ошибаюсь, то убедить меня в этом ты сможешь лишь вникнув в определения википедии, а не продавливая мнение что я ошибся, игнорируя что я пишу в ответ.
G>Своей головой еще думать нужно.
Твои слова да тебе в уши. Включай голову-то!
>> Если ты не готов, или не собираешься это делать, то тебе остается понять, что формально обсуждать образы в твоей голове контрпродуктивно.
G>Тра-ля-ля, финтифлюшник-крючкотвор.
Здравствуйте, grosborn, Вы писали:
>> О чем можно дискутировать, если не договорились что называть локальной перменной? Какое уж тут ООП?
G>О чем можно дискутировать, если такие понятия вызывают трудность? Вообще бардак какой-то в голове у тебя, scope видите ли можно "назначать". Ты эта, давай с википедией завязывай и начинай читать учебники с ситематичным изложением материала. Потому что твой моск не выдержал шрапнели от комбинаторного взрыва, вызванного запоминанием большого количества статей википедии не объединенных в стройную систему пониманий.
> G>Не увиливай. Как не крутись, а переменная определенная в вышестоящей процедуре, во вложенной не локальная. > Согласно определению — локальная. И ты пока не привел ничего, согласно чему можно было бы считать что она локальной не является.
Вот ты опять несешь антивикипедическую ересь. В википедии нет такого определения, какое ты тут придумал. Я вот доложу про тебя олигархату.
> G>У них и область видимости, то есть scope разные, и время жизни. > Действительно разные и я не утверждал обратного. > > G>С внешней не дотянуться до внутренней. Ну никак. Так что давай, садись на жопкой на горячую сковородку и признавай поражение. > Поражение пока запишем за тобой, т.к. никакой аргументации твоим тезисам, кроме личной неприязни к википедии, ты не продемонстрировал.
Стрелочник. Продолжаешь увиливать и пытаешь перевести стрелки на личность, приписываешь мне неприязнь к википедии. А я всего-лишь не абсолютизирую ее, отношусь взвешенно. В вики пишут разные люди, но славатехоспади находятся еще в вики редакторы, способные противостоять абсолютизму. И ты скорее всего писал туда свои алогичные формализмы и тебя скорее всего правили. И я нормально к этому отношусь. И меня правили, и я рад этому. Вики это не божественное творение, призванное заменить человеку моск.
>>> Вобщем, если я в чем-то и ошибаюсь, то убедить меня в этом ты сможешь лишь вникнув в определения википедии, а не продавливая мнение что я ошибся, игнорируя что я пишу в ответ. > > G>Своей головой еще думать нужно. > Твои слова да тебе в уши. Включай голову-то! > >>> Если ты не готов, или не собираешься это делать, то тебе остается понять, что формально обсуждать образы в твоей голове контрпродуктивно. > > G>Тра-ля-ля, финтифлюшник-крючкотвор. >
Здравствуйте, grosborn, Вы писали:
>> G>Не увиливай. Как не крутись, а переменная определенная в вышестоящей процедуре, во вложенной не локальная. >> Согласно определению — локальная. И ты пока не привел ничего, согласно чему можно было бы считать что она локальной не является.
G>Вот ты опять несешь антивикипедическую ересь. В википедии нет такого определения, какое ты тут придумал. Я вот доложу про тебя олигархату.
Определение есть и я его приводил. Докладывай.
>> Поражение пока запишем за тобой, т.к. никакой аргументации твоим тезисам, кроме личной неприязни к википедии, ты не продемонстрировал.
G>Стрелочник. Продолжаешь увиливать и пытаешь перевести стрелки на личность, приписываешь мне неприязнь к википедии. А я всего-лишь не абсолютизирую ее, отношусь взвешенно. В вики пишут разные люди, но славатехоспади находятся еще в вики редакторы, способные противостоять абсолютизму. И ты скорее всего писал туда свои алогичные формализмы и тебя скорее всего правили. И я нормально к этому отношусь. И меня правили, и я рад этому. Вики это не божественное творение, призванное заменить человеку моск.
По порядку.
Пока ты не объяснил, чем конкретно тебя не устраивают конкретные определения с википедии, я буду склонен считать что у тебя пунктик относительно нее.
На википедии не все гладко, это верно. Люди разные, да. И ты тоже людь в этом смысле. Твои тезисы, а особенно ничем не подкрепленные, не являются абсолютной истиной и без посторонней редакции очень сомнительны. Я там не зарегистрирован. То что тебя там правили — я тоже этому рад, хотя и не сказать что сильно, т.к. ты проявляешь тенденцию к этому.
Мне не нравится обсуждать людей, составляющих википедию. Давай конкретнее. Чем тебе не нравятся те определения? Чем твои лучше? Где вообще те определения, которыми ты пользуешься? Если таки нравятся, то объясни, почему ты переменные внешней функции не считаешь локальными для вложенной.
I>> type
I>> pProc = procedure(s:string);
I>> function X(s:string):pProc;far;
I>> procedure X1;far;
I>> begin;
I>> WriteLn(s);
I>> end;
I>> begin;
I>> X := @X1;
I>> end;
I>>
S>Отличный пример. А что мешает ему скомпилиться? Извини, у меня TP для проверки нету.
Тип pProc можно использовать для параметра, но нельзя для возвращаемого значения, это можно обойти хаком.
I>>Ну и мануал, там есть подсказка S>Ну вот в подсказке вроде очень похожий пример. Неужели TP умеет escape-analysis и запрещает передавать адреса вверх по стеку, разрешая вниз?
В этом месте в турбопаскале большая дыра, почти ничем не прикрытая.
Здравствуйте, Sinclair, Вы писали:
G>>А это ты сам придумал. S>Профессионал должен уметь и размышлять, а не только цитировать авторитеты. Я с samius согласен.
С чем именно ты согласен ?Вот два его высказывания:
"по определению замыкания с той же википедии, замыканием считается функция, позволяющая работать с нелокальными переменными."
"Раз переменные внешней функции определены для вложенной функции, значит они локальны для вложенной по этому определению"
Из этого просто и понятно следует что локальные это нелокальные если вдруг мы передадим функцию не вниз, а вверх.
Что бы был смысл, нужно дать определение слову "локальный". В этой части в Википедии большая ошибка. В ней вообще чуть не все определения сделаны через одно место. Не нужно изобретать велосипед, уже давно дали определение слову локальный — не глобальный.
Глобальный — видим во всех скопах
Локальный — это не глобальный, то есть видим не во всех скопах
непосредственно локальный — в единственном скопе, в котором определен
общий — в нескольких скопах
Теперь легко и просто понять, что такое замыкания — использование общих переменных. теперь, если надо вводить первоклассные функции, нужно всего то добавить время жизни — захват == продление времени жизни общей переменной до времени жизни использующей функции.
Что интересно, в данном случае вложеные функции паскаля будут замыканиями.
Здравствуйте, grosborn, Вы писали:
G>Бу-га-га-га
Ну, вашему определению удовлетворяет.
>> G>Лень тут совершенно не при чем. J или C# это не стековая машина, как паскаль, данные не на стеке, отсюда (ну и не только) и различия в реализации. >> Вот это новости! Куда делся стек? В прошлый раз, когда я читал ECMA-338, стек дотнета был на месте. >> Коллега, вы меня пугаете! Можно пруфлинк в студию? G>Ты опять потроллить решил и перевираешь слова. В лес.
Ну, то есть пруфлинка про нестековость машины C# мы не увидим? Тогда, конечно, в лес.
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Здравствуйте, Ikemefula, Вы писали:
V>>Я демонстрирую то, что утверждал: что твои лямбда-штучки в дизайне не видны, а являются сугубо локальной механикой... Той самой, которую можно заменить на инфраструктуру из нескольких строчек и локальные, опять же, ф-ии.
I>Ты показал что функциональщина это функциональщина, а обещал показать что функциональщина это процедурное.
Я и показал, бо никаких функциональных вещей НЕ использовал. Вообще никаких. Ссылка на процедуру известна со времен ассемблера еще до появления ЯВУ и присутствует во всех сколь-нибудь важных для индустрии императивных языках. Даже там где нет аналога AdressOf (например, в Фортране), там аналогичная техника работает через Computed GOTO.
То бишь, вот это полный бред: "Ты показал что функциональщина это функциональщина". Бред потому, что ты наделяешь один из аргументов обычной процедуры (контекст) каким-то магическим св-вом. А нет никакой магии, бо этот входной аргумент процедуры ничем не лучше и не хуже других аргументов пользовательских типов. Это чистейший процедурный подход.
Просто ты отрицаешь само наличие декомпозиции задачи в рамках процедурного подхода (или не понимаешь её, ХЗ). В процедурном подходе декомпозиция отталкивается от данных и алгоритмов их обработки. Сравни с ООП — это совсем другая вселенная. В этом смысле ФП фундаментально недалеко ускакало от процедурного подхода, что я и заметил упомянув дизайн. И ты попался! ))) Мне доставляет определенный фан наблюдение за тем, как оппоненты ловятся на том, что соглашаются о близости ООП и процедурного подхода (наверно из-за застилающей им глаза мутабельности/императивности), но спорят насчет близости процедурного подхода и ФП. С т.з. дизайна программ всё наоборот, ес-но.
I>>>Ты демонстрируешь ООП и ФП а не процедурное программирование. V>>Мне виднее, я успел на ПП пописать несколько лет до полноценного переползания на ООП. Реально ООП и ФП используют практические наработки процедурного/структурного программирования, а вовсе не наоборот. I>Из твоих примеров это не следует.
Боюсь, в ответ на мои обоснования тебе придется привести свои. Простое "нет" не канает.
I>Не важно. Мы говорим совсем на другую тему и количетсво комбинаторов в моих примерах не имеет значения
Гы, ты еще и контекст теряешь... Имеет значение там, где ты говорил о разнице в 10-100 раз для последнего своего примера на лмбдах, будь он переписан без них. Сорри, но такой прогноз можно дать только от непонимания механики работы ФП.
V>>Локальные есть во всех процедурных языках, а что? Это ф-ии, видимые лишь из одной единицы компиляции. То бишь нигде более не объявляемые и никуда не экспортируемые. I>Нет.
Да.
I>Покажи мне локальные функции для языка Си. Спасибо.
Такая пойдет: void function_57C24FEC93AC4ED0867305FE733CF6E1() {}? )))
Здравствуйте, vdimas, Вы писали:
I>>Ты показал что функциональщина это функциональщина, а обещал показать что функциональщина это процедурное.
V>Я и показал, бо никаких функциональных вещей НЕ использовал. Вообще никаких. Ссылка на процедуру известна со времен ассемблера еще до появления ЯВУ и присутствует во всех сколь-нибудь важных для индустрии императивных языках. Даже там где нет аналога AdressOf (например, в Фортране), там аналогичная техника работает через Computed GOTO.
Ты использовал для аргумента локальные функции == без пяти минут лямбды, это и есть функциональщина.
Указатель на функцию — снова поддержка ФП.
V>Просто ты отрицаешь само наличие декомпозиции задачи в рамках процедурного подхода (или не понимаешь её, ХЗ). В процедурном подходе декомпозиция отталкивается от данных и алгоритмов их обработки.
Ага, а указатель на функцию это данные, да ?
>Сравни с ООП — это совсем другая вселенная. В этом смысле ФП фундаментально недалеко ускакало от процедурного подхода, что я и заметил упомянув дизайн.
В твоей трактовке это так потому что в процедурное ты записываешь фичи из ФП.
I>>Из твоих примеров это не следует.
V>Боюсь, в ответ на мои обоснования тебе придется привести свои. Простое "нет" не канает.
Все аргументы я привел, возможно ты их не понял, это другой разговор.
I>>Не важно. Мы говорим совсем на другую тему и количетсво комбинаторов в моих примерах не имеет значения
V>Гы, ты еще и контекст теряешь... Имеет значение там, где ты говорил о разнице в 10-100 раз для последнего своего примера на лмбдах, будь он переписан без них. Сорри, но такой прогноз можно дать только от непонимания механики работы ФП.
Нет, не имеет.
V>>>Локальные есть во всех процедурных языках, а что? Это ф-ии, видимые лишь из одной единицы компиляции. То бишь нигде более не объявляемые и никуда не экспортируемые. I>>Нет.
V>Да.
Тогда покажи аналог моего кода на языке СИ. Том самом что ввели Ричи и Керниган. Ну, раз там есть локальные функции, стало быть количество кода у тебя не изменится, правильно ?
I>>Покажи мне локальные функции для языка Си. Спасибо.
V>Такая пойдет: void function_57C24FEC93AC4ED0867305FE733CF6E1() {}? )))
Нет, это не локальная функция. В Си вообще нет локальных фунций, этот язык не умеет захватывать свободные переменные. В итоге тебе нужно
1. описать структуру для захвата
2. описать функцию которая будет работать с этой структурой
3. выполнить захват, то есть создать экземпляр, инициализировать
4. освободить память (хрен знает когда)
Внезапно оказывается что qsort принимает указатель на обычные функции, а про твой захват ничего не знает, опаньки, для различных коллекций надо писать свою функцию сортировки.
Здравствуйте, grosborn, Вы писали:
G>А-ха-ха, заметил свою ошибку и пытаешься меня подловить, хамишь опять. Это была твоя мысль что у C# нет стека, это залет как сказал бы vdimas.
Если вы — второй аккаунт vdimas'а, то вас я тоже буду игнорировать.
А если нет, то мысль про отсутствие стека в C# я взял отсюда:
J или C# это не стековая машина, как паскаль, данные не на стеке, отсюда (ну и не только) и различия в реализации.
Вы точно уверены, что это не вы писали?
Уйдемте отсюда, Румата! У вас слишком богатые погреба.