Здравствуйте, FDSC, Вы писали:
FDS>Всё равно, если удобство есть, то "майнстрим" всё примет, как принял, например, ALGOL-60 или FORTRAN, а затем и C++ и Java
Дык в то-то и загвоздка, что мейнстрим не выбирает самые удачные решения, а всего-лишь достаточно хорошие
. Уж не знаю, как там дела обстояли с Algol-ом и Fortran-ом, но вот C++ пример весьма показательный (например, если сравнивать с Eiffel, который появился всего парой лет позже и является языком того же класса).
SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Здравствуйте, FDSC, Вы писали:
FDS>>>Почему вам это сообщение показалось смешным? ГВ>>Этот постинг улыбнул меня своей пионерской наивностью. Я даже не нашёлся, что ответить. FDS>И что вы тут видите такого наивного?
Главным образом, предположение о волне стартапов. Тут по-соседству дискуссия очень ясно это осветила. Мне, в общем, добавить нечего.
<< Под музыку: a-Ha — Take on me >>
<< При помощи Януса: 1.2.0 alpha rev. 650 >>
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Здравствуйте, FDSC, Вы писали:
FDS>Здравствуйте, Курилка, Вы писали:
К>>Здравствуйте, FDSC, Вы писали:
FDS>>>но тогда у нас получается, что этот блок кода просто очередные фигурные скобки, как и в других языках и никаких преимуществ К>>Что ты имеешь в виду под фигурными скобками? {} как в сях и шарпе? К>>В них можно передавать параметры?
FDS>В примере не был приведён пример передачи параметров. Параметры в них передавать можно — через локальные переменные, других способов ни там, ни там я не вижу.
FDS>Я так и не понял, в чём разница
FDS>
FDS>DataTable msgTable = msgs.Tables["message"]; if (msgTable.Absent) return 0;
FDS>
Разница в том, что 1) блок можно передавать в качестве аргумента в функцию 2) существуют блоки с параметрами (синтаксис у них такой — [ :param1 :param2 | тело блока ]).
Всё это вместе позволяет создавать методы более высокого уровня абстракции (а значит, уменьшает дублирование кода). "at:ifAbsent:" — пример как раз такого метода более высокого уровня абстракции. Он выполняет набор действий "взять из коллекции объект по указанному ключу, а если он отсутствует — выполнить указанные действия".
Здравствуйте, eao197, Вы писали:
E>Здравствуйте, FDSC, Вы писали:
FDS>>Всё равно, если удобство есть, то "майнстрим" всё примет, как принял, например, ALGOL-60 или FORTRAN, а затем и C++ и Java
E>Дык в то-то и загвоздка, что мейнстрим не выбирает самые удачные решения, а всего-лишь достаточно хорошие
. Уж не знаю, как там дела обстояли с Algol-ом и Fortran-ом, но вот C++ пример весьма показательный (например, если сравнивать с Eiffel, который появился всего парой лет позже и является языком того же класса).
Скорее всего "майнстрим" выбирает самые лучшие решения. Вопрос только в том, что считать самым лучшим
Здравствуйте, Eugene Beschastnov, Вы писали:
EB>Здравствуйте, FDSC, Вы писали:
FDS>>Здравствуйте, Курилка, Вы писали:
К>>>Здравствуйте, FDSC, Вы писали:
FDS>>>>но тогда у нас получается, что этот блок кода просто очередные фигурные скобки, как и в других языках и никаких преимуществ К>>>Что ты имеешь в виду под фигурными скобками? {} как в сях и шарпе? К>>>В них можно передавать параметры?
FDS>>В примере не был приведён пример передачи параметров. Параметры в них передавать можно — через локальные переменные, других способов ни там, ни там я не вижу.
FDS>>Я так и не понял, в чём разница
FDS>>
FDS>>DataTable msgTable = msgs.Tables["message"]; if (msgTable.Absent) return 0;
FDS>>
EB>Разница в том, что 1) блок можно передавать в качестве аргумента в функцию 2) существуют блоки с параметрами (синтаксис у них такой — [ :param1 :param2 | тело блока ]). EB>Всё это вместе позволяет создавать методы более высокого уровня абстракции (а значит, уменьшает дублирование кода). "at:ifAbsent:" — пример как раз такого метода более высокого уровня абстракции. Он выполняет набор действий "взять из коллекции объект по указанному ключу, а если он отсутствует — выполнить указанные действия".
В таком случае, VladD2 полностью прав, когда говорит, что это по типу goto. Причём это небезопасное использование goto.
Здравствуйте, pavel74, Вы писали:
P>у любого другого инструмента есть плюсы и минусы, главное их адекватно оценивать.
От. Золотые слова. А то вот я в всое время наслушавшись хвалебных песен о Долфине скачал его шестую версию и... был сильно разочарован. Возможно если бы мне не сказали, что это мега-круто, то я бы и не был так разочарован. Но когда тебе говорят о мега-крутости, а на поверку в среде нет даже комплит-ворда, то чувствуешь себя обманутым.
Что до моих слов о "трепе"... Извини за выражение, но по сути подобрать другое слово было тяжело. Разговоры о том, как что-то будет круто на практике — это одно. А вот использование чего-то на практике — это дургое. В условиях реальной работы многие восторженные мысли уходят, а проблемы выявляются.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, FDSC, Вы писали:
FDS>В таком случае, VladD2 полностью прав, когда говорит, что это по типу goto. Причём это небезопасное использование goto.
Ты пример приведи, того что тебя пугает. И станет сразу видно правильно ты понимаеш или нет
Здравствуйте, VladD2, Вы писали:
VD>От. Золотые слова. А то вот я в всое время наслушавшись хвалебных песен о Долфине скачал его шестую версию и... был сильно разочарован. Возможно если бы мне не сказали, что это мега-круто, то я бы и не был так разочарован. Но когда тебе говорят о мега-крутости, а на поверку в среде нет даже комплит-ворда, то чувствуешь себя обманутым.
Судя по стенаниям, ты ждал женскую грудь, а получил коровье вымя.
VD>Что до моих слов о "трепе"... Извини за выражение, но по сути подобрать другое слово было тяжело. Разговоры о том, как что-то будет круто на практике — это одно. А вот использование чего-то на практике — это дургое. В условиях реальной работы многие восторженные мысли уходят, а проблемы выявляются.
Именно. Но плюсов всё равно больше.
ЗЫ. И комплит-ворд в Дольфине есть, и броузер кода удобный, и рефакторинг работает, и на ST там всё написано кроме ВМ и виндовых контролов.
ЗЫЫ. Не похоже на Студию, запустить и работать не получится — согласен.
Здравствуйте, Andrei N.Sobchuck, Вы писали:
ANS>Здравствуйте, FDSC, Вы писали:
FDS>>В таком случае, VladD2 полностью прав, когда говорит, что это по типу goto. Причём это небезопасное использование goto.
ANS>Ты пример приведи, того что тебя пугает. И станет сразу видно правильно ты понимаеш или нет
Здравствуйте, Дарней, Вы писали:
VD>>В общем, это не нормальное положение вещей. Они дейсвительно протеворечат принкципам мэйнстрима. У нас на сайте даже есть статьи о библиотеке автор которой попытался создать замену регексам на Яве. Думаю это не с праста. Путь откровенно говря не очень верный, но посылки...
Д>а ты не помнишь, где это было?
Здравствуйте, FDSC, Вы писали:
FDS>>>>>Меня испугало то, что можно выйти откуда угодно. Это значит, что вызвав некоторую функцию я не буду уверен, что она вернёт управление
EB>>>>Гхм... А как ты относишься к exception-ам?
FDS>>>Положительно
EB>>Извини, но я вижу в твоих словах некоторое противоречие.
FDS>Тут нет никаких противоречий. Exception возвращает управление вызывающей функции, а не к чёрту на кулички.
Ну, exception-ы бывают и unchecked.
FDS>А если функция просто куда-то не туда передаст управление, ищи её потом свищи.
По-моему, с твоей стороны есть некоторое недопонимание. Если ты просто вызываешь какую-то функцию, то тебе управление тебе нормально вернётся (разумеется, если не было exception-а). А вот если ты выполняешь блок (не передаёшь его в качестве параметра, а именно выполняешь там, куда передал) — тогда да, управление может не вернуться (потому что, как я уже говорил, блок исполняется в том контексте, где было создан, а не где был запущен на выполнение). Запускается на выполнение блок вызовом у него метода "value" (в случае, если блок без параметров) или "value:", "value:value:", "value:value:value:" и т.д. (если блок требует аргументов).
В качестве примера опишу два метода, один из которых вызывает другой с блоком в качестве параметра (всё, что в двойных кавычках — комментарии):
startingMethod "Здесь мы описываем создаваемый метод - указываем его имя и параметры.
В данном случае имя метода - startingMethod, а параметров у него нету"
| aBlock | "Здесь мы указываем, что у нас в методе используется локальная переменная aBlock"
aBlock := [^123]. "Здесь мы присваиваем переменной aBlock блок, который возвращает число 123.
ВАЖНО: блок здесь создаётся, но не выполняется."
self methodThatWorksWithBlock: aBlock. "Здесь мы вызываем у самого себя метод methodThatWorksWithBlock: с параметром aBlock"
methodThatWorksWithBlock: aBlock "Здесь мы описываем создаваемый метод - указываем его имя и параметры.
В данном случае имя метода - methodThatWorksWithBlock: , и у метода есть один параметр - aBlock"
| blockResult | "Здесь мы указываем, что у нас в методе используется локальная переменная blockResult"
blockResult := aBlock value. "Здесь мы выполняем блок aBlock, пришедший нам в качестве параметра,
а результат выполнения записываем в переменную blockResult.
ВАЖНО: блок выполняется в том контекстве, где он было создан -
т.е. в нашем случае в контексте метода startingMethod.
При этом, если в блоке был выполнен оператор выхода из метода,
то из метода value мы _не_ возвращаемся."
^blockResult "Возвращаем blockResult"
Хех, немножко накосячил EB>... Метод "at:ifAbsent:" (который, кстати, является стандартным и имеется у всех типов коллекций) ...
Разумеется, "у всех типов коллекций, для которых он имеет смысл" . Т.е. если из коллекции нельзя достать объект по ключу или по индексу, то и метода такого у этой коллекции нету.
Здравствуйте, Andrei N.Sobchuck, Вы писали:
ANS>Здравствуйте, FDSC, Вы писали:
FDS>>В конечном итоге вообще не понятно, что кто вернёт, откуда и куда и не получиться ли зацикливания.
ANS>copilation failed. То есть не понял в (псевдо-)коде ничего.
Ну, я хотел сказать, что если мы объявили делегат, и return приведёт к выходу не из этой функции, а из какой-то другой, то мы можем сделать так, что функция получит выход сама на себя. Ну или другие последствия, как при передачи простой метки в функцию для скачка.
Здравствуйте, Eugene Beschastnov, Вы писали:
EB>В качестве примера опишу два метода, один из которых вызывает другой с блоком в качестве параметра (всё, что в двойных кавычках — комментарии): EB>
EB>startingMethod "Здесь мы описываем создаваемый метод - указываем его имя и параметры.
EB> В данном случае имя метода - startingMethod, а параметров у него нету"
EB> | aBlock | "Здесь мы указываем, что у нас в методе используется локальная переменная aBlock"
EB> aBlock := [^123]. "Здесь мы присваиваем переменной aBlock блок, который возвращает число 123.
EB> ВАЖНО: блок здесь создаётся, но не выполняется."
EB> self methodThatWorksWithBlock: aBlock.
"Здесь мы вызываем у самого себя метод methodThatWorksWithBlock: с параметром aBlock"
EB>
EB>methodThatWorksWithBlock: aBlock
"Здесь мы описываем создаваемый метод - указываем его имя и параметры.
EB> В данном случае имя метода - methodThatWorksWithBlock: , и у метода есть один параметр - aBlock"
EB> | blockResult | "Здесь мы указываем, что у нас в методе используется локальная переменная blockResult"
EB> blockResult := aBlock value. "Здесь мы выполняем блок aBlock, пришедший нам в качестве параметра,
EB> а результат выполнения записываем в переменную blockResult.
EB> ВАЖНО: блок выполняется в том контекстве, где он было создан -
EB> т.е. в нашем случае в контексте метода startingMethod.
EB> При этом, если в блоке был выполнен оператор выхода из метода,
EB> то из метода value мы _не_ возвращаемся."
EB> ^blockResult "Возвращаем blockResult"
EB>
Спасибо, теперь я уверен, что понимаю всё правильно. Некоторые вопросы сразу сняты.
Но в таком случае может возникнуть куча проблем с тем, что пользователь не сообщив никак исполняющему методу выходит в другой метод: проектирование методов усложняется, нужно всё время помнить, что человек может передать возврат в исполняемом блоке, который ты никак не перехватишь.
Пожалуй всё. Мне даже понравилась такая возможность, её иногда нехватает.
Здравствуйте, FDSC, Вы писали:
FDS>Здравствуйте, Andrei N.Sobchuck, Вы писали:
ANS>>Здравствуйте, FDSC, Вы писали:
FDS>>>В конечном итоге вообще не понятно, что кто вернёт, откуда и куда и не получиться ли зацикливания.
ANS>>copilation failed. То есть не понял в (псевдо-)коде ничего.
FDS>Ну, я хотел сказать, что если мы объявили делегат, и return приведёт к выходу не из этой функции, а из какой-то другой, то мы можем сделать так, что функция получит выход сама на себя. Ну или другие последствия, как при передачи простой метки в функцию для скачка.
Где ты метку взял? Тебе везде goto мерещится?
Блоки смолтолковские и рубивские — это лямбды по сути, никаким образом не метки, и лямбды возвращают управление в том месте, где они были вызваны.
Здравствуйте, Mirrorer, Вы писали:
M>На безрыбье как говорится..
Вот, вот. И удобство тут не причем.
M>Может оно конечно и nicer, но пахнет регэксами..
Это не лучший вариант. EBDF бывает разным. Но даже так это пахнет только если что-то простое. На сложном ты сразу увидишь разницу.
M>+1 Но что-то мне подсказывает что мейнстрим далеко не сразу примет альтернативу, даже если она появится..
Как я уже говорил, мэйнстрим реально регекспы использует не часто. Многие программисты их или вообще не знают, или в них плавают.
M>Именно парадоксальность ситуации с регэксами заставляет меня задуматься о том, что непривычный синтаксис, не является по большому счету препятствием.
А не заставляет задуматься тот факт, что после очередной порции рекламы Смолтока сразу же появляются впоросы вроде этого
?
M> Я не считаю его хуже или лучше. Просто он другой, и его не принял мейнстрим. Но регэксы принял M>Вот этого я не могу понять...
Скажем так. Принял плохо и только потому что нет альтернативы. Уверен, что если бы альтернатива была бы и была бы понятнее, то регексы пошли бы в помойку.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.