ANS>В начале нужно объеденить первую и вторую строчку, потому что эти две физические конструкции объеденяют одну логическую. И так, убираем точку-с-запятой и переносим "if" на верх. Затем вместо шифровки "value == null" пишем простое и понятное "Absent". И, вуаля...
Ну, вообще-то правильно — так:
1. Джава sux: нам не нужен никакой гет, вместо этого используется синтаксически более прозрачный индексер
2. Джава sux: а если в словаре хранятся значения примитивного типа, то мы что будем возвращать? А что делать, если мы хотим намеренно сохранить null?
3. Смоллток sux: это что, нам надо в каждом методе предоставлять параметры для разных исходов? А если я этого не сделал?
4. Смоллток sux: а теперь давайте сравним значения из двух словарей по ключу, при этом отсутствующие в любом из словарей считаем одной и той же ситуацией:
foreach(string key in externalKeys)
try
{
if (aMapLeft[key] != aMapRight[key]) mismatches++;
}
catch(KeyNotFoundException knfe)
{
mismatches++;
}
Как мы передадим один и тот же continuation в два метода?
Я не против continuation, но реализация на них ыполне прямолинейной логики обработки ошибок — weird.
1.1.4 stable rev. 510
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Здравствуйте, VladD2, Вы писали:
VD>А ты не трепись, а возьми и на рабое исползуй вместо Дельфи+АБП+ТЭмЕкЭль какой-нить Дольфин+МайЭсКуЭль+ещеКакяТоХрень, а потом поделись мнеием. Уверен, что после Дельфи Дольфин тебя не впечатлит.
Уже используемые инструменты и технологии по многим причинам не так просто взять и изменить на другие. Даже если эти и другие и имеют в чем-то преимущества. Это вообще отдельная тема.
Насчет Дольфина ты ошибся. От знакомства с этой средой и смолтоком у меня положительных впечатлений просто масса, хотя есть конечно же там и свои проблемы. Что касается смолтоковским сред в целом то как у любого другого инструмента есть плюсы и минусы, главное их адекватно оценивать. Я для себя оценку сделал. Что-то кому-то доказывать до хрипоты у меня нет ни времени ни самое главное желания.
Здравствуйте, Дарней, Вы писали:
Д>ответ очень прост — большие компании консервативны и неповоротливы, они не могут извлечь пользу из новых технологий. Но стартапы этим не страдают, и они давно бы воспользовались любой технологией, которая может дать им преимущество. Хотя бы малейшее.
37 signals
Использовали тогда еще не очень широкоизвестный язык Ruby. И попутно сделали тогда еще мало кому известный RubyOnRails. Причем по высказываниям DHH (разработчика RoR) явно следует, что Ruby и RoR были для них конкурентными преимуществами.
Д>Поскольку я не вижу волны таких стартапов, построенных на "элитарных языках", я делаю простой вывод — все их преимущества высосаны из пальца.
Могу ошибаться, но вообще очень мало стартапов, построенных вокруг какой-то идеи, выживают. Так что "волны" стартапов не может быть в принципе.
SObjectizer: <микро>Агентно-ориентированное программирование на C++.
VD>Откровенно говоря вигрыш в количестве элементов тут небольшой, а вот читаемость кода явно уменьшается. Ведь он становится не структурным. Твой ^0 по последствиям мало отличается от goto.
VD>Я бы как раз предпочел бы первый вариант.
VD>Ну, и надо понимать, что Tables это коллекция которая может просто не иметь метода ifAbsent.
Влад, ты меня просто умиляешь Я уже далеко не первый раз, глядя на твои посты, вспоминаю "Собачье сердце", а конкретно момент с обсуждением переписки Энгельса и Каутского.
По пунктам: "^0" в Smalltalk ровно настолько же близок к goto, как "return 0" в C# — потому что это в точности то же самое.
Далее, в приведённом примере на Smalltalk нету метода "ifAbsent". Там есть метод "at:ifAbsent:" с двумя агрументами. Для лучшего понимания распишу максимально подробно, что происходит в этом примере (для простоты я не буду заострять внимание на том, что вызов метода осуществляется с помощью посылки сообщения — потому что в данном случае это не важно):
1) Предположим, этот код у нас выполняется в некотором методе method1.
2) У объекта msgs вызывается метод tables без аргументов. Назовём возвращаемый результат object1.
3) У объекта object1 (см. п.2) вызывается метод "at:ifAbsent:" с двумя аргументами. Первый аргумент — строка 'messages', второй аргумент — блок кода [^0]. Метод "at:ifAbsent:" (который, кстати, является стандартным и имеется у всех типов коллекций) выполняет следующее:
3.1) Проверяет, есть ли в коллекции, у которой его вызвали (т.е. у object1), объект с ключём, переданным в качестве первого аргумента (т.е. с 'messages').
3.2) Если есть — возвращает объект, лежащий в коллекции по этому ключу (назовём его object2).
3.3) Если нету — выполняет блок кода, переданный вторым аргументом (т.е. [^0]) и возвращает результат его выполнения. Здесь замечу, что в Smalltalk блоки выполняются в том контексте, где они были созданы — причём это касается как локальных переменных, так и позиции в стеке выполнения. В данном случае мы выполняем код "^0" в контексте метода method1. В Smalltalk символ "^" выполняет ровно то же самое действие, что ключевое слово "return" в си-подобных языках. Т.е. мы возвращаем 0 из метода method1 (см. п.1).
4) Ну и наконец, если мы еще не вышли из метода method1, присваиваем переменной msgTable объект object2 (см. п.3.2).
Здравствуйте, FDSC, Вы писали:
FDS>Меня испугало то, что можно выйти откуда угодно. Это значит, что вызвав некоторую функцию я не буду уверен, что она вернёт управление
Здравствуйте, VladD2, Вы писали:
VD>Здравствуйте, FDSC, Вы писали:
VD>>>Pascal и С — оба являются клонами Алгола/Фортрана. Так что учить один после другого не сложно. А выбор между ними — это выбор предпочтений.
FDS>>Ага, однако программирование на них довольно сильно различается. Вообще говоря, просто думаешь другими понятиями.
VD>Все относительно. По сравнению с программированием на Схеме или Хаскеле разницу между С и Пасклем не увидить в микроском. Вся разница в деталях. Библиотеки и те большее влияние оказывают.
Хм-м-м. Видать у нас совершенно разное мышление. Для меня библиотеки — это фигня. Главное запомнить, что там есть определённые возможности и всё. А язык влияет на представление алгоритма в коде и после того, как я долго программирую на C++ мои программы на Delphi выглядят несколько неподельфийски.
VD>Несколько лет назад я без проблем программировал на C++, Delphi, SQL Windows SAL и VB одновременно. А ведь это куда более разные языки нежели С и Паскаль. После изучения второго языка третий и четвертый дались очень легко. А вот столкнувшись с ФЯ, Смолтоком и Прологом я действительно поломал голову. Проблема даже не научитсья писать на этих языка, а научиться глядеть на решение задачи по другому.
Я C++ изучал после Dephi, assmbler, и VBScript (для IE). Наверное, я просто менее поворотливый
Не уверен, что у вас так же, но я сначала думаю про решение, а потом стараюсь его перенсти в язык. В таком виде главная проблема, это научиться переносить решение на конкретный язык, а ещё точнее, максимально полно использовать неочевидные возможности языка. Думаю, это всё-таки и есть научиться писать на языках, а не сменить точку зрения на решение задачи (может быть, сменить точку зрения на очевидные или стандартные решения?)
FDS>> Да и если сравнить Фортран с C++, различия в синтаксисе довольно значимые. Я, например, испытывал затруднения, когда читал Фортрановские программы, зная C++ и Pascal, а вот C++ читал нормально, зная только Pascal.
VD>Фортран просто более древний язык. Но лично я особо его не зная спокойно читаю примеры на нем из книжек.
И у вас небыло переходного периода, когда вы не очень его понимали? Я то же стал лучше его понимать, после прочтения 4 или 5 книг, где он использовался как примеры. Но всё равно не очень. А PL/1 вы то же без труда понимаете?
FDS>>Вы сами очень любите Nemerle, а его синтаксис (только не убеждайте меня, что он похож на C#, сам знаю) меня раздражает . Так что принципиально нет разницы между вами, говорящими что Nemerle лучше C# и людьми, говорящими, что Lisp лучше C.
VD>"Раздражает" и "срывает крышу/полностью непонятен" — это, как говорят в Одессе, две большие разницы. Есть люди которых раздражает VB, есть те кого раздражает С или Паскаль. Например, не раз слышал заявления, что begin/end это ужасно, или что ужасны фигурные скобочки. VD>Такое раздражение проходит через 10 минут реальной работы. Особенно когда язык предоставляет значительно более мощные возможности.
Собственно, я и хотел сказать, что раздражает и срывает крышу — это количественные показатели сложности, принципиально неразличные. Человек привыкает ко всему, вопрос только во времени (если укрепить "крышу", то её может унести если только вместе с домом....).
Вся проблема в том, что меня раздражает то, как эти более мощные возможности представляются. Меня, например, C++ раздражал пока я на нём не написал как минимум 4500 строк. Думаю, это не 10 минут работы . (а вот assembler меня никогда не раздражал, если не считать разницы в мнемонических обозначениях команд в intel 8086 и, напирмер, Intel 8080). Проще говоря, меня раздражает, когда то, что у меня в мозгах сложно переносить в то, что в компьютере, даже если при этом на это нужно меньше строк кода. Возможно, я просто слишком поверхностно ознакомился с возможностями Nemerle, но они паказались мне просто небезопасными.
VD>Думаю, что поклонники Смолтока стали таковыми именно потому, что им понравились некие возможности которых небыло в С++ или скажем Дельфи. Для них преодоление своих привычек и ломка мозга показалась оправданной. Не спорю, что по сравнению с С++ это действительно может быть оправданным. Но вот по сравнению с другими языками это уже не вполне оправдано. Перейдя с того же C#-а на Смолток ты не получишь каких-то радикальных возможностей. С Лиспом несколько по другому. Тут действительно возможности отндью не иллюзорны, но вот ломка сознания уже принципиальная.
Возможно, речь идёт о том, что при переносе алгоритма из неформального представления в формальное требуется некоторый вспомогательный алгоритм? (имеется ввиду, что формальные и неформальные представления слишком различны и требуют дополнительного слоя согласования)
VD>Так что Немерле — это как раз тот язык который позволяет не ломая сознания и не отказываясь от всего того к чему привык воспользоваться всеми теми вкусностями которые доступны во всех "непривычных" языках. Потому он мне и нравится.
А вот меня он ломает и очень сильно. Так что я прав
VladD2 wrote:
> Я незнаю, что там кто-то нашел в его словах познавательного. Он ничего новго не сказал. Но вот то что его слова в большинстве случаев были направлены на унижение окружающих — это факт. То что это кого-то подталкнуло к изучению какого-то ФЯ нисколько не снимает отвественности за слова с этого товарища.
Панимаш ли, я вот тоже знаю на этом форуме заметную фигуру, которая
периодически высказывает интересные мысли, а периодически называет слова
собеседника булшитом, ахинеей и флудом .
в первый раз вообще слышу
E>Использовали тогда еще не очень широкоизвестный язык Ruby. И попутно сделали тогда еще мало кому известный RubyOnRails. Причем по высказываниям DHH (разработчика RoR) явно следует, что Ruby и RoR были для них конкурентными преимуществами.
ах, этот RoR... как много рекламного звона вокруг него вьется!
E>Могу ошибаться, но вообще очень мало стартапов, построенных вокруг какой-то идеи, выживают. Так что "волны" стартапов не может быть в принципе.
выживает вообще очень мало стартапов, это факт. Но выживают только те, за которыми стоит какая-то идея. Так что если возникнет мощная, но невостребованная мэйнстримом идея — можешь не сомневаться, волна будет.
Здравствуйте, Курилка, Вы писали:
К>Здравствуйте, FDSC, Вы писали:
FDS>>Здравствуйте, Курилка, Вы писали:
К>>>Здравствуйте, FDSC, Вы писали:
FDS>>>>Здравствуйте, Andrei N.Sobchuck, Вы писали:
ANS>>>>>ЗЫ: программирование это путь к ошибкам.
FDS>>>>В данном случае это путь к ошибкам, потому что в программе появляется (потенциально) множество неочевидных связей, если я правильно понял пример.
К>>>Откуда ты взял множетство да ещё и неочевидных связей? Конкретно что тебя испугало?
FDS>>Меня испугало то, что можно выйти откуда угодно. Это значит, что вызвав некоторую функцию я не буду уверен, что она вернёт управление
К>Имхо ты неверно понял идею — возврат идёт в итератор по сути, который вернёт управление в твой блок.
Так вот, "возврат" выполняется не в контексте блока, а в контексте где блок определён. То есть выполнение команды "return" из анонимной функции в C#, или метода анонимного класса в Java возвращают управление в код, вызвавший эту функцию. А в ST происходит возврат из того метода, где был блок определён.
Здравствуйте, Eugene Beschastnov, Вы писали:
EB>Здравствуйте, FDSC, Вы писали:
FDS>>Меня испугало то, что можно выйти откуда угодно. Это значит, что вызвав некоторую функцию я не буду уверен, что она вернёт управление
EB>Гхм... А как ты относишься к exception-ам?
Здравствуйте, Курилка, Вы писали:
К>Здравствуйте, FDSC, Вы писали:
FDS>>Чем же ваш пример так хуже. Ну, сделайте другой метод, что бы было
FDS>>
FDS>>DataTable msgTable = msgs.Tables["message"]; if (msgTable.Absent) return 0;
FDS>>
К>Как минимум твой код упадёт от NullReferenceException
С какой стати? Я могу сделать так, что msgs.Tables["message"] вернёт пустой объект, который будет в методе Asbent возвращать флаг пустого сотояния
Мы же говорим про языки, а данная возможность языку никак не противоречит.
FDS>>
Здравствуйте, Дарней, Вы писали:
E>>37 signals
Д>в первый раз вообще слышу
С таким же успехом ты мог прозевать еще десяток-другой успешных стартапов.
E>>Могу ошибаться, но вообще очень мало стартапов, построенных вокруг какой-то идеи, выживают. Так что "волны" стартапов не может быть в принципе.
Д>выживает вообще очень мало стартапов, это факт. Но выживают только те, за которыми стоит какая-то идея. Так что если возникнет мощная, но невостребованная мэйнстримом идея — можешь не сомневаться, волна будет.
А в приведенном мной примере она, т.е. волна, есть. И ты сам ее видишь:
ах, этот RoR... как много рекламного звона вокруг него вьется!
SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Здравствуйте, VladD2, Вы писали:
VD>А в чем удобство то? Может я слепой, но не вижу удобства в чтении или запоминании всех тих закорючек, звездочке, плюсиков и скобок.
Сам их не люблю. Но если придется выбирать между написанием ДКА и использованием регэксов я выберу регэкс. На безрыбье как говорится..
VD>Регексы — специализированный язык описания регулярных граматик. Говоря современным языком — это DSL. Сравнивать его с универсальным языком некорректно.
Я сравнивал синтаксис регэкспов и синтаксис Smalltalk. Может это действительно некорректно. VD>А вот сравнить регулярные выражения и EBNF вполне можно.
Ознакомился с EBNF. Здесь
EBNF: What is it, and why do we need it?
In DL I had to use recursion (ie: DL can produce new DLs) to express the fact that there can be any number of Ds. This is a bit awkward and makes the BNF harder to read. Extended BNF (EBNF, of course) solves this problem by adding three operators:
? : which means that the symbol (or group of symbols in parenthesis) to the left of the operator is optional (it can appear zero or one times)
* : which means that something can be repeated any number of times (and possibly be skipped altogether)
+ : which means that something can appear one or more times
An EBNF sample grammar
So in extended BNF the above grammar can be written as:
Может оно конечно и nicer, но пахнет регэксами..
VD> Так что они есть просто потому, что нет легко доступных других срдств.
+1 Но что-то мне подсказывает что мейнстрим далеко не сразу примет альтернативу, даже если она появится..
VD>Так и Смолток. Да формально он жив, так как есть фэн-сайты, его кто-то использует. Но мы же говорим об его пригодности для мэйнстрима?
Именно парадоксальность ситуации с регэксами заставляет меня задуматься о том, что непривычный синтаксис, не является по большому счету препятствием. Я не считаю его хуже или лучше. Просто он другой, и его не принял мейнстрим. Но регэксы принял
Вот этого я не могу понять...
... << RSDN@Home 1.1.4 PINK FLOYD — Shine On You Crazy Diamond (Part Two)>>
Здравствуйте, FDSC, Вы писали:
FDS>Здравствуйте, Курилка, Вы писали:
К>>Имхо ты неверно понял идею — возврат идёт в итератор по сути, который вернёт управление в твой блок.
FDS>
FDS>Так вот, "возврат" выполняется не в контексте блока, а в контексте где блок определён. То есть выполнение команды "return" из анонимной функции в C#, или метода анонимного класса в Java возвращают управление в код, вызвавший эту функцию. А в ST происходит возврат из того метода, где был блок определён.
Здравствуйте, Andrei N.Sobchuck, Вы писали:
ANS>Хочу заметить, что синтаксис в ST единообразный и нигде не корёжится
что синтаксис единообразный — вот это и плохо. Я всё-таки привык, что он сильно различается у разных конструкций и помогает выделять структуру программы. Да и не только я к этому привык, судя по всему
Здравствуйте, Дарней, Вы писали:
Д>Здравствуйте, eao197, Вы писали:
E>>С таким же успехом ты мог прозевать еще десяток-другой успешных стартапов.
Д>Если стартап по настоящему успешен, то прозевать его просто не дадут. Мы ведь не в каменном веке все-таки, кругом сплошное информационное пространство
Что-то видимо это пространство тебя мимо обошло коли ты такой нашумевший стартап не слышал