Здравствуйте, Eugene Beschastnov, Вы писали:
EB>Да. Если бы это вызывало хоть какую-нибудь проблему (с проектированием, с пониманием, с дебагом или с чем-то другим) — я бы скорее всего об этом услышал.
Ты? Ты упорно не хочешь слышать то, что до тебя пытются донести и еще надменно демонстриуешь неуважительное отношение к оппонентам.
EB>Не соглашусь. Ничего особенно классного в этом примере я не вижу (кстати, по хорошему бы надо бы написать "return" вместо "goto"). Возможно, в Nemerle это и создаёт какие-то проблемы (сам я Nemerle не знаю, поэтому судить не могу), но в Smalltalk — нет.
Ага. Создаются. Открою тебе пару секретов. До одного из них ты мог бы догадаться и сам. Return в Немерле является структрынм оператором и не может врнуть управление вне рамок струтуры кода. Ретурн в фнукции выйдет именно из нее, а не из функции где та была объявлена.
Второе же откровение, которое тебе будет тяжелее понять — это то что в Немерле в общем-то нет return. return в этом языке — это макрос эмулирующий поведение оного в C#. Этот макрос нуно специальным образом импортировать. Сам же Немерле (точнее его авторы) пропагандируют вычисления вместо передачи управления. Функция в Немерле — это выражение! Ты вообще не можешь передать управление. Ты можешь только ветвить вычисления. Таким образом не то что невозможно выйти из выражения не вернув значени, но вообще невозможно передать управление. Это приводит к упрощению читения кода. Ты можешь быть уверен, что выражение вернет результат и что управление не перескачит куда попало.
FDS>>кто даст гарантию, что какой-нибудь "умник" так не сделает EB>Как "так"?
А как это сделал ты. Взять и в выражении (да по сложнее) выйти из него без возврата результата. Разумный программист увидит вычисления и так как они его не интересует предположит, что вычисления закончатся результатом помещенным в переменную и пойдет дальша, а на самом деле нужно быо анализировать весь код выражения так как он мог попросту прервать выражение.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, Eugene Beschastnov, Вы писали:
EB>В Smalltalk нет break, continue и goto .
^ пожалуй будет по круче чем break и continue. Вот с goto она успешно поконкурирует, только с С-шным дальним goto, так как goto в C# не позволят выходить из функций.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, Геннадий Васильев, Вы писали:
ГВ>Окстись! Слово-то такое "Lisp" слышали не все, а пользоваться им умеют и не боятся ещё более редкие представители. Из этих редких единиц ещё более редкие единицы действительно будут стартапить. Не все же спят и видят, как бы заняться собственным стартапом. Откуда тут "волна" стартапов выпрыгнет?
Ты опять ставишь всё с ног на голову. Начнем с того, что стартапят далеко не "редкие единицы". Из хороших программистов 99,9% хотя бы раз задумывалось об открытии своего дела, задолбавшись исполнять команды идиота-руководителя А большинство из них не только думает, но и делает — иначе они не были бы хорошими программистами.
Да, хороших программистов мало. Но у плохих всё равно нет никаких шансов поднять свой стартап, поэтому их не стоит вообще принимать в рассмотрение.
Далее. Неважно, знают они Лисп, Смоллток или Хаскелл изначально. Любой хороший программист выбирает инструмент под задачу, и проводит предварительные исследования, эксперименты, прежде чем начать реальную работу. Писать на языке Х "потому что я его уже хорошо знаю" — это прерогатива плохих программистов. Если инструмент дает реальные преимущества — значит, выберут именно его. И неважно, требует он предварительного привыкания или нет — тем более что для хорошего программиста это не составит никаких проблем, не так ли?
Здравствуйте, Andrei N.Sobchuck, Вы писали:
ANS>Здравствуйте, Курилка, Вы писали:
К>>К примеру, что будет если блок вернуть из метода? А в блоке будет возврат из этого метода (который уже завершился)?
ANS>Ран-тайм исключение.
Не вижу тогда практического смысла в этом (в нелокальных возвратах из блока) и блоки наружу передавать становится проблемно — каждый раз добавлять обработку исключений?
Здравствуйте, VladD2, Вы писали:
VD>Здравствуйте, Beam, Вы писали:
VD>Объясню почему я не согласен с этим сообщением, в отличии от толп товаришей.
VD>Это сообщение подменяет тему. Примеры из него невинныи и впоросов не вызвают. Но цель его доказать невреную посылку.
VD>Речь шао не о блоках кода и их полезности, а о неструкторной передаче управления.
VD>Вернись к исходным примерам в которых выход из бока или приводитк к тому, что функция никтогда не возвращает упаравления, или к тому что выражение может не вернуть результат, апередать управление в другое место в любой своей точке просто из-за появления там "рышки" (символа ^).
VD>Ты серьзно считаешь, что применение таких техник оправдано элюзорным уменьшением объема кода?
Дарней,
Д>Ты опять ставишь всё с ног на голову. Начнем с того, что стартапят далеко не "редкие единицы". Из хороших программистов 99,9% хотя бы раз задумывалось об открытии своего дела, задолбавшись исполнять команды идиота-руководителя А большинство из них не только думает, но и делает — иначе они не были бы хорошими программистами. Д>Да, хороших программистов мало. Но у плохих всё равно нет никаких шансов поднять свой стартап, поэтому их не стоит вообще принимать в рассмотрение. Д>Далее. Неважно, знают они Лисп, Смоллток или Хаскелл изначально. Любой хороший программист выбирает инструмент под задачу, и проводит предварительные исследования, эксперименты, прежде чем начать реальную работу. Писать на языке Х "потому что я его уже хорошо знаю" — это прерогатива плохих программистов. Если инструмент дает реальные преимущества — значит, выберут именно его. И неважно, требует он предварительного привыкания или нет — тем более что для хорошего программиста это не составит никаких проблем, не так ли?
Здравствуйте, VladD2, Вы писали:
EB>>Вот и я не помню ни одной ошибки (ни у себя, ни у кого-либо другого) из-за того, что в блоке выполнялся нелокальный возврат.
VD>А я вижу что уже не хочу читить написанный тобой код, так как он непредсказуем (не структурирован).
Если не знать основы языка (а поведение блоков — это основы) — то да, непредсказуем. То же самое можно сказать про код, в котором выскакивают unchecked exception-ы — для человека, не знающего поведения exception-ов.
Вообще, на блоках в Smalltalk сделано практически всё — работа с коллекциями, exception-ы, параллельные процессы,и т.д. и т.п. И я не видел ни одной жалобы на непонятность поведения блоков — в том числе и от новичков. Разумеется, "теоретические" рассуждения на RSDN от людей, не знающих Smalltalk, не в счёт.
Здравствуйте, VladD2, Вы писали:
VD>Блок без оператора "^" является классической Лямбдой с лексическим замыканием и присутствует во многих языках (в том же C#, например). А с ним является граблями ждущими своего часа.
25 лет ожиданий — слегка слишком долго для граблей
Здравствуйте, VladD2, Вы писали:
EB>>Ну не получается . Ни у меня, ни у кого другого, использующего Smalltalk (замечу — именно использующего). Что мы не так делаем?
VD>Не делаете полезной раоты в составе более менее большой команды? Я угадал?
Скорее всего они делают всю полезную работу в составе маленькой команды, и поэтому в большой команде просто нет необходимости.
SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Здравствуйте, VladD2, Вы писали:
EB>>Не соглашусь. Ничего особенно классного в этом примере я не вижу (кстати, по хорошему бы надо бы написать "return" вместо "goto"). Возможно, в Nemerle это и создаёт какие-то проблемы (сам я Nemerle не знаю, поэтому судить не могу), но в Smalltalk — нет.
VD>Ага. Создаются. Открою тебе пару секретов. До одного из них ты мог бы догадаться и сам. Return в Немерле является структрынм оператором и не может врнуть управление вне рамок струтуры кода. Ретурн в фнукции выйдет именно из нее, а не из функции где та была объявлена.
VD>Второе же откровение, которое тебе будет тяжелее понять — это то что в Немерле в общем-то нет return. return в этом языке — это макрос эмулирующий поведение оного в C#. Этот макрос нуно специальным образом импортировать.
Интересная особенность реализации. Но ты не находишь, что эта твоя фраза противоречит предыдущему абзацу? Раз return является макросом — значит его можно переписать и изменить ему поведение.
VD>Сам же Немерле (точнее его авторы) пропагандируют вычисления вместо передачи управления. Функция в Немерле — это выражение! Ты вообще не можешь передать управление. Ты можешь только ветвить вычисления. Таким образом не то что невозможно выйти из выражения не вернув значени, но вообще невозможно передать управление. Это приводит к упрощению читения кода. Ты можешь быть уверен, что выражение вернет результат и что управление не перескачит куда попало.
Спасибо за краткую лекцию по ФП, но я, в общем-то, в курсе. Или ты хочешь сказать, что Smalltalk плох, потому что не является чистым ФЯ?
FDS>>>кто даст гарантию, что какой-нибудь "умник" так не сделает EB>>Как "так"?
VD>А как это сделал ты. Взять и в выражении (да по сложнее) выйти из него без возврата результата. Разумный программист увидит вычисления и так как они его не интересует предположит, что вычисления закончатся результатом помещенным в переменную и пойдет дальша, а на самом деле нужно быо анализировать весь код выражения так как он мог попросту прервать выражение.
Ты. Не. Понимаешь.
Вообще.
Где он это увидит? Приведи пример (можно на псевдокоде — только, пожалуйста, не Nemerle-вском).
Что касается "выражений посложнее": в Smalltalk средний размер метода — 6-7 строк. Включая определение переменных и прочее. Где тут можно сделать "блок посложнее"?
Eugene Beschastnov,
VD>>Блок без оператора "^" является классической Лямбдой с лексическим замыканием и присутствует во многих языках (в том же C#, например). А с ним является граблями ждущими своего часа.
EB>25 лет ожиданий — слегка слишком долго для граблей
Что-то не навится мне такая аргументация.
Не мог бы ты привести снэпшот из рабочего кода, который бы активно использовал возвращения из блоков кода. Можно со вложенными блоками даже. Можно небольшой классик, там... От тебя требуется минимальные телодвижения, а я уже сносно читаю СТ-нотацию, больших проблем быть не должно.
А то чувствую, скоро аргументация скатится до "Ты казёл — сам казёл"...
Здравствуйте, VladD2, Вы писали:
VD>А как это сделал ты. Взять и в выражении (да по сложнее) выйти из него без возврата результата. Разумный программист увидит вычисления и так как они его не интересует предположит, что вычисления закончатся результатом помещенным в переменную и пойдет дальша, а на самом деле нужно быо анализировать весь код выражения так как он мог попросту прервать выражение.
В Smalltalk тоже нельзя прервать выражение.
Например:
SomeClass>>foo
|a b|
a := self bar. "возвращает что-то типа [:x | ^x + 42]"
b := a value. "сюда мы уже не попадем, потому что предыдущая строка вызовет исключение"
...
При попытке вызова этого метода в любезно предложенном отладчике мы увидим следующее (VisualWorks):
cannotReturn: value
"Raise a signal which means that the reciever attempted to return
(with the supplied value), but its sender cannot be returned into
(e.g. sender is nil, probably because the receiver already returned).
This message is sent by the execution machinery (the VM or some
execution simulator such as a debugger)."
CannotReturnError new
context: self;
parameter: value;
raise
Отмечу также, что вместо
(...) ifTrue: [^0] ifFalse: [^1].
можно (и рекомендуется) писать так:
^(...) ifTrue: [0] ifFalse: [1].
Здравствуйте, VladD2, Вы писали:
VD>Здравствуйте, FR, Вы писали:
VD>>>Хм. А как что же их тогда объявлять? Или ты предлагаешь вообще их не объявлять? Последнее приводит к ошибкам. Это натуральные грабли. Одна опечатка и ищи ошибку часами.
FR>>Не заметил, опять?
VD>Прости, что?
Здравствуйте, VladD2, Вы писали:
VD>Здравствуйте, FR, Вы писали:
FR>>То что там окна MFC'шные не обязательно значит что среда написана на C++. Как пример есть биндинг MFC на питон, и на питоне можно писать используя MFC. И даже есть IDE написаное на питоне используя MFC — PythonWin.
VD>Да, да. Шрирлиц все равно скажет, что апельсины приносил...
VD>Не надо много умностей. Мы слышим от фанатов Смолток о том, что среды этого языка написаны на Смолток, а на повреку там МФЦ-шный код. Что тут умничать? Все же очевидно.
Очевидно только то что используется MFC, это ни как ни противоречит тому что сама среда полностью написана на смалтоке.
Здравствуйте, Дарней, Вы писали:
Д>Да, хороших программистов мало. Но у плохих всё равно нет никаких шансов поднять свой стартап, поэтому их не стоит вообще принимать в рассмотрение.
У плохих программистов есть не меньше шансов поднять свой стартап.