Здравствуйте, Курилка, Вы писали:
К>Здравствуйте, VladD2, Вы писали:
VD>>Здравствуйте, Курилка, Вы писали:
К>>>Откуда ты взял множетство да ещё и неочевидных связей? Конкретно что тебя испугало?
VD>>Связи тут не причем, но в общем он прав, по-моему. Этот код не структурен. Переход управления из подвыражения черти куда (к концу функции) — это не структурный переход. Это все равно что допустить return внутри выражений С: VD>>
VD>>int i = x ? 2 : return -1;
VD>>
VD>>Внутри объемного кода эото неминуемо приведет к неочевидному поведению.
VD>>В функциональных языках return то не приветствуется, а тут вольный выход из любой точки выражения. По-моему, то чистой воды грабли.
К>Опять 25, вот здесь
вроде описано, что возврат-то идёт из блока, который содержится в выражении, а не из метода, в котором содержится выражение, разницу ощущаешь?
К>P.S. вроде смолтолк вообще почти не знаю, поэтому могу ошибаться , но если бы было как ты утверждаешь, то это грабли, причём кривее некуда, а тут просто лямбда и не более
Ага, грабли. Посмотри внимательно:
blockResult := aBlock value. "Здесь мы выполняем блок aBlock, пришедший нам в качестве параметра,
а результат выполнения записываем в переменную blockResult.
ВАЖНО: блок выполняется в том контекстве, где он было создан —
т.е. в нашем случае в контексте метода startingMethod. При этом, если в блоке был выполнен оператор выхода из метода,
то из метода value мы _не_ возвращаемся."
Одним сторонником в наших рядах больше .
Вот если бы эти лямбды нельзя было бы передавать как параметры другим методам, тогда можно было бы сказать, что это полезно и не слишком опасно для ограниченного применения.
FDS> blockResult := aBlock value. "Здесь мы выполняем блок aBlock, пришедший нам в качестве параметра,
FDS> а результат выполнения записываем в переменную blockResult.
FDS> ВАЖНО: блок выполняется в том контекстве, где он было создан —
FDS> т.е. в нашем случае в контексте метода startingMethod.
FDS> При этом, если в блоке был выполнен оператор выхода из метода,
FDS> то из метода value мы _не_ возвращаемся."
Смысла выделенного я вообще не понимаю
FDS>Одним сторонником в наших рядах больше .
У тебя число бинарное деление всего?
FDS>Вот если бы эти лямбды нельзя было бы передавать как параметры другим методам, тогда можно было бы сказать, что это полезно и не слишком опасно для ограниченного применения.
Наоборот смысл лямб в том и есть, чтобы передавать анонимные функции в другие функции, если не передавать, то грош им цена и нафиг не упало.
Здравствуйте, Курилка, Вы писали:
К>Здравствуйте, FDSC, Вы писали:
FDS>>Тогда в чём ошибка в том примере? Можешь в той ветке объяснить подробнее (а то между двумя ветками неудобно)?
К>А там есть ошибка?
Да, я в другом посте уже тебе ответил. Тут закрываем.
Здравствуйте, Курилка, Вы писали:
К>Здравствуйте, FDSC, Вы писали:
FDS>>Ага, грабли. Посмотри внимательно:
FDS>>
FDS>> blockResult := aBlock value. "Здесь мы выполняем блок aBlock, пришедший нам в качестве параметра,
FDS>> а результат выполнения записываем в переменную blockResult.
FDS>> ВАЖНО: блок выполняется в том контекстве, где он было создан —
FDS>> т.е. в нашем случае в контексте метода startingMethod.
FDS>> При этом, если в блоке был выполнен оператор выхода из метода,
FDS>> то из метода value мы _не_ возвращаемся."
К>Смысла выделенного я вообще не понимаю
Чего ж тут непонятного? Вот загвоздка в том, как он возвращает результат в blockResult, если по return он выходит в другой метод?
FDS>>Вот если бы эти лямбды нельзя было бы передавать как параметры другим методам, тогда можно было бы сказать, что это полезно и не слишком опасно для ограниченного применения.
К>Наоборот смысл лямб в том и есть, чтобы передавать анонимные функции в другие функции, если не передавать, то грош им цена и нафиг не упало.
Здравствуйте, VladD2, Вы писали:
ГВ>>Есть. Ты забываешь про лес и выделяешь деревья. Win2K очень много дельного говорит (как и камрад Kolhoz). VD>Цитаты, плиз, в студию. Что же он такого сказал, что не было сказано до него в приличной форме?
Да ничего нового, в общем. Для меня, во всяком случае. Зато кратко и честно, хоть и грубовато.
А ещё грамотно и без опечаток. Очень уж мне эта черта импонирует.
ГВ>> Не знаю, зачем это ему нужно. Может быть, его тоже достал "майнстрим" со своими амбициями? VD>Примеры амбиций мэйнстрима тоже хотелось бы поглядеть.
Специализация по странным критериям, ориентация на a priori низкоквалифицированного программиста. Выхолащивание понятия "программист" до "кодер". Достаточно?
Если не достаточно, то добавлю ещё перекорёживание тезиса о постоянном обучении. Извини, но прыжки по направлению C++ -> Java -> C# -> ASP и прочий web никак "учёбой" назвать нельзя. Это натаскивание на новые API в рамках одной идеи и не более того. А ещё и перекос в сторону "специалистов по API xxxxx", специалистов "по библиотеке X".
И главное, майнстрим не ставит своей целью борьбу со скукой. Наоборот, спящий мозг — самое то.
Ну и кому это понравится?
<< Под музыку: Gregorian — Heaven Can Wait (Interlude) >>
<< При помощи Януса: 1.2.0 alpha rev. 650 >>
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Похоже, всё-таки надо расписать еще чуть подробнее. Я проставил номера строк и добавил код с вызовом startingMethod (см. ниже). При вызове я считаю, что эти методы находятся в классе SomeClass.
startingMethod "1.1. Здесь мы описываем создаваемый метод - указываем его имя и параметры.
В данном случае имя метода - startingMethod, а параметров у него нету"
| aBlock | "1.2. Здесь мы указываем, что у нас в методе используется локальная переменная aBlock"
aBlock := [^123]. "1.3. Здесь мы присваиваем переменной aBlock блок, который возвращает число 123.
ВАЖНО: блок здесь создаётся, но не выполняется."
self methodThatWorksWithBlock: aBlock. "1.4. Здесь мы вызываем у самого себя метод methodThatWorksWithBlock: с параметром aBlock"
^987 "1.5. Возвращаем значение 987"
methodThatWorksWithBlock: aBlock "2.1. Здесь мы описываем создаваемый метод - указываем его имя и параметры.
В данном случае имя метода - methodThatWorksWithBlock: , и у метода есть один параметр - aBlock"
| blockResult | "2.2. Здесь мы указываем, что у нас в методе используется локальная переменная blockResult"
blockResult := aBlock value. "2.3. Здесь мы выполняем блок aBlock, пришедший нам в качестве параметра,
а результат выполнения записываем в переменную blockResult.
ВАЖНО: блок выполняется в том контекстве, где он было создан -
т.е. в нашем случае в контексте метода startingMethod.
При этом, если в блоке был выполнен оператор выхода из метода,
то из метода value мы _не_ возвращаемся."
^blockResult "2.4. Возвращаем blockResult"
myObject := SomeClass new. "3.1. Создаём объект класса SomeClass и записываем его в переменную myObject."
myResult := myObject startingMethod. "3.2. Вызываем метод startingMethod у объекта myObject."
myResult printSomewhere. "3.3. Выводим результат где-то."
Выполнение будет происходит в следующей последовательности: 3.1
3.2 (вызов метода startingMethod)
1.3 (присваивание переменной aBlock значения, равного "объект 'блок' с содержимым [^123]")
1.4 (вызов метода "methodThatWorksWithBlock:")
2.3 (вызов метода "value" у объекта aBlock)
1.3 (выполнение блока и выход из метода startingMethod с возвращением значения "123")
3.2 (присваивание переменной "myResult" значения "123")
3.3
Ну, сейчас вроде бы никаких непониманий точно не должно быть
VD>>>...относиться с уважением и к другим. Они ведь тоже что-то сделали?!
ГВ>>Как ты думаешь, почему считается некорректным приём дискуссии, называемый "апелляцией к опыту"? Никогда не задумывался?
VD>Задумывался. Когда ты к нему прибегал.
Ну так почему же этот приём считается некорректным?
<< Под музыку: Кельтская гитара — Леди туманной горы >>
<< При помощи Януса: 1.2.0 alpha rev. 650 >>
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
FDS>> blockResult := aBlock value. "Здесь мы выполняем блок aBlock, пришедший нам в качестве параметра,
FDS>> а результат выполнения записываем в переменную blockResult.
FDS>> ВАЖНО: блок выполняется в том контекстве, где он было создан —
FDS>> т.е. в нашем случае в контексте метода startingMethod.
FDS>> При этом, если в блоке был выполнен оператор выхода из метода,
FDS>> то из метода value мы _не_ возвращаемся."
Здравствуйте, Andrei N.Sobchuck, Вы писали:
ANS>Судя по стенаниям, ты ждал женскую грудь, а получил коровье вымя.
Да, что-то вроде того.
ANS>ЗЫ. И комплит-ворд в Дольфине есть,
Появился в 7-ой версии и насколько я понимаю не полноценный (работает только для переменных явно инициализированных объектами).
ANS> и броузер кода удобный,
Дык тут никаких проблем нет.
ANS> и рефакторинг работает,
А вот это меня все время интересовало. Я сам сейчас занимаюсь похожими вещами и прекрасно понимаю как это все работает на статически типизированном языке. Но вот для днамически типизированного я 100%-ых алгоритмов не вижу. Где-нибудь есть описание того на каких принципах рабоатет рефакторинг в Смолтоке? И вообще, где найти описание фичь рефакторинга?
Об этом было бы очень интересно услышать.
ANS> и на ST там всё написано кроме ВМ и виндовых контролов.
Спай четко показывает, что все окна написаны на MFC или еще чем-то там (давно дело было). То есть сама среда написана на С++ или с нехилым его применением.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, trophim, Вы писали:
T>Здравствуйте, FDSC, Вы писали:
FDS>>Ага, вопрос: что мешало авторам сделать язык без этой особенности?
T>Чтоб было не как у всех. А то как еще отличиться?
Здравствуйте, Eugene Beschastnov, Вы писали:
VD>>В функциональных языках return то не приветствуется, а тут вольный выход из любой точки выражения. По-моему, то чистой воды грабли. EB>Ну блин %-). А ТЫ как относишься к exception-ам?
А как исключения относятся к выходу черт знает куда?
Да и что получится если блоки кода сложить в коллекцию, потом выдти из функции где были созданны эти блоки, и после этого повызывать эти блоки?
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
EB> blockResult := aBlock value. "2.3. Здесь мы выполняем блок aBlock, пришедший нам в качестве параметра, EB> а результат выполнения записываем в переменную blockResult.
EB>Ну, сейчас вроде бы никаких непониманий точно не должно быть
Остался вопрос, как написать aBlock так, что бы blockResult получил значение
Здравствуйте, FDSC, Вы писали:
FDS>Здравствуйте, Eugene Beschastnov, Вы писали:
EB>> blockResult := aBlock value. "2.3. Здесь мы выполняем блок aBlock, пришедший нам в качестве параметра, EB>> а результат выполнения записываем в переменную blockResult.
EB>>Ну, сейчас вроде бы никаких непониманий точно не должно быть
FDS>Остался вопрос, как написать aBlock так, что бы blockResult получил значение
EB>1.3 (выполнение блока и выход из метода startingMethod с возвращением значения "123")
Вот и получаем грабли
Значит заблуждался я про ST и не лямбды это вовсе, а вообще непонятная конструкция из которой фиг знает чего можно натворить.
К примеру, что будет если блок вернуть из метода? А в блоке будет возврат из этого метода (который уже завершился)?
Здравствуйте, Eugene Beschastnov, Вы писали:
EB>Здравствуйте, FDSC, Вы писали:
FDS>>Здравствуйте, Eugene Beschastnov, Вы писали:
EB>>> blockResult := aBlock value. "2.3. Здесь мы выполняем блок aBlock, пришедший нам в качестве параметра, EB>>> а результат выполнения записываем в переменную blockResult.
EB>>>Ну, сейчас вроде бы никаких непониманий точно не должно быть
FDS>>Остался вопрос, как написать aBlock так, что бы blockResult получил значение
EB>
EB>aBlock := [123].
EB>
EB>Т.е. просто без выхода из метода.
Это я догадался. А если бы мне нужно было написать настоящую функцию?
Здравствуйте, Курилка, Вы писали:
К>Здравствуйте, Eugene Beschastnov, Вы писали:
EB>>1.3 (выполнение блока и выход из метода startingMethod с возвращением значения "123")
К>Вот и получаем грабли К>Значит заблуждался я про ST и не лямбды это вовсе, а вообще непонятная конструкция из которой фиг знает чего можно натворить. К>К примеру, что будет если блок вернуть из метода? А в блоке будет возврат из этого метода (который уже завершился)?
Я уже про это думал. Но наверное это вообще синтаксически невозможно. К тому же, в C++, например, можно вернуть указатель на локальную переменную, но ведь никто этого не делает. Тут проблема в более сложных конструкциях будет.
Здравствуйте, WolfHound, Вы писали:
WH>Здравствуйте, Eugene Beschastnov, Вы писали:
VD>>>В функциональных языках return то не приветствуется, а тут вольный выход из любой точки выражения. По-моему, то чистой воды грабли. EB>>Ну блин %-). А ТЫ как относишься к exception-ам? WH>А как исключения относятся к выходу черт знает куда? WH>Да и что получится если блоки кода сложить в коллекцию, потом выдти из функции где были созданны эти блоки, и после этого повызывать эти блоки?
А что получится, если даже невыходя из функции вызвать эти блоки?
Здравствуйте, Курилка, Вы писали:
К>В своей заметке Райан Бэйкер делает интересное, хотя очень спорное замечание: К>В лиспе код есть данные и данные есть код, но в итоге в лиспе нет синтаксиса, только скобки, тогда как в техже сиподобных языках есть скобки для вызова функции, фигурные — для блоков кода, квадратные — для массивов. Всё это и многое другое делает код более легко делимым на разные смысловые "куски". К>Так вот — хотелось бы рассмотреть вопрос: насколько синтаксис языка определяет его удобство для использования? К>P.S. Данный вопрос выглядит интересным, к примеру в свете соседнего обсуждения Смолтолка с его тоже не очень "общепринятым" синтаксисом. К>P.P.S. С данным мнением лично я не совсем согласен и меня не пугают горы скобок, да и синтаксис в лиспе присутствует (см. комментарии к заметке), "просто вы не умеете их готовить"
Смнтаксис важен настолько же насколько важен человеческий язык для общения людей , млм математическая нотация которой общаются математики. Насколько было бы удобно изучать и использовать другую нотацию , например сложение записывалось бы символом "=" а вычитание буквой "т" ?
Известно , что счет удобнее вести в 12 рмчной системе исчесления , но пользуемся мы 10 ричной ..