Здравствуйте, VladD2, Вы писали:
VD>Да, уж. Забавно, что если бы не любовь к смешиванию с дерьмом, то их (егоЭ) бы было интересно послушать.
Кстати говоря да, я даже сегодня прочитал все сообщения Win2K'ея. Если фильтровать все его поливания дерьмом остальных, то он очень толковые вещи говорит, местами.
((lambda (x) (list x (list 'quote x))) '(lambda (x) (list x (list 'quote x))))
VD>> Так что они есть просто потому, что нет легко доступных других срдств. M>+1 Но что-то мне подсказывает что мейнстрим далеко не сразу примет альтернативу, даже если она появится..
Это он по инерции её не примет.
VD>>Так и Смолток. Да формально он жив, так как есть фэн-сайты, его кто-то использует. Но мы же говорим об его пригодности для мэйнстрима? M>Именно парадоксальность ситуации с регэксами заставляет меня задуматься о том, что непривычный синтаксис, не является по большому счету препятствием. Я не считаю его хуже или лучше. Просто он другой, и его не принял мейнстрим. Но регэксы принял M>Вот этого я не могу понять...
Когда появились регулярные выражения ничего их заменяющего и превосходящего не было. Вообще ничего, даже близко. С языками программирования не так: ассемблер может составить конкуренцию любому другому языку просто в результате инертности мышления
Здравствуйте, Дарней, Вы писали:
Д>проблема в том, что эту волну создаешь ты в одиночку.
С каких это пор это стало проблемой?
Помнится, года полтора назад я был единственным здесь, кто про Ruby говорил. Сейчас ситуация уже изменилась. И это только начало.
Д>Реально успешных проектов на нем я не вижу.
Здравствуйте, Курилка, Вы писали:
К>Здравствуйте, FDSC, Вы писали:
FDS>>Здравствуйте, Курилка, Вы писали:
К>>>Имхо ты неверно понял идею — возврат идёт в итератор по сути, который вернёт управление в твой блок.
FDS>>
FDS>>Так вот, "возврат" выполняется не в контексте блока, а в контексте где блок определён. То есть выполнение команды "return" из анонимной функции в C#, или метода анонимного класса в Java возвращают управление в код, вызвавший эту функцию. А в ST происходит возврат из того метода, где был блок определён.
Далее, в приведённом примере на 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).
но тогда у нас получается, что этот блок кода просто очередные фигурные скобки, как и в других языках и никаких преимуществ
FDS>но тогда у нас получается, что этот блок кода просто очередные фигурные скобки, как и в других языках и никаких преимуществ
Что ты имеешь в виду под фигурными скобками? {} как в сях и шарпе?
В них можно передавать параметры?
...
• By December 2006, you're likely to see more published books on Rails than any of Java's single flagship frameworks, including JSF, Spring, or Hibernate.
• The Rails framework has been downloaded at least 500,000 times in only its second year, as of May 2006. These statistics compare favorably with the most popular open source frameworks in any language.
• The Rails community mailing lists get hundreds of notes a day, compared to dozens on the most popular Web development frameworks in other languages.
• The Rails framework has caused an explosion in the use of the Ruby programming language, which has been relatively obscure until recently.
• The Rails buzz generates increasingly hot debates on portals that focus on other programming languages. The Java community in particular has fiercely debated the Rails platform
...
А то, что на RSDN пока мало кто кроме eao197 о нем говорит, это еще не показатель.
Д>Реально успешных проектов на нем я не вижу.
Насчет этого ничего сказать не могу.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
It is always bad to give advices, but you will be never forgiven for a good one.
Oscar Wilde
Здравствуйте, VladD2, Вы писали:
VD>>>...относиться с уважением и к другим. Они ведь тоже что-то сделали?! ГВ>>Как ты думаешь, почему считается некорректным приём дискуссии, называемый "апелляцией к опыту"? Никогда не задумывался? VD>Задумывался. Когда ты к нему прибегал.
Ну так почему же этот приём считается некорректным?
VD>Со своей стороны хочу спросить. Я правильно понял, что по сути вопроса у тебя возражений нет?
Есть. Ты забываешь про лес и выделяешь деревья. Win2K очень много дельного говорит (как и камрад Kolhoz). Не знаю, зачем это ему нужно. Может быть, его тоже достал "майнстрим" со своими амбициями? Я вот ничего оскорбительного в его словах не вижу, хотя моя деятельность (как ты это по-соседству верно заметил) совпадала периодически с майнстримовой. Только я не думаю, что если мне довелось макнуться в... в майнстрим, то майнстрим — это рулез форевер.
<< Под музыку: Best of celtic music — Track 05 >>
<< При помощи Януса: 1.2.0 alpha rev. 650 >>
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Здравствуйте, FDSC, Вы писали:
FDS>Почему вам это сообщение показалось смешным?
Этот постинг улыбнул меня своей пионерской наивностью. Я даже не нашёлся, что ответить.
<< Под музыку: a-Ha — Manhattan skyline >>
<< При помощи Януса: 1.2.0 alpha rev. 650 >>
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Здравствуйте, FDSC, Вы писали:
FDS>>>Меня испугало то, что можно выйти откуда угодно. Это значит, что вызвав некоторую функцию я не буду уверен, что она вернёт управление
EB>>Гхм... А как ты относишься к exception-ам?
FDS>Положительно
Извини, но я вижу в твоих словах некоторое противоречие.
Здравствуйте, Курилка, Вы писали:
К>Здравствуйте, FDSC, Вы писали:
FDS>>но тогда у нас получается, что этот блок кода просто очередные фигурные скобки, как и в других языках и никаких преимуществ К>Что ты имеешь в виду под фигурными скобками? {} как в сях и шарпе? К>В них можно передавать параметры?
В примере не был приведён пример передачи параметров. Параметры в них передавать можно — через локальные переменные, других способов ни там, ни там я не вижу.
Я так и не понял, в чём разница
DataTable msgTable = msgs.Tables["message"]; if (msgTable.Absent) return 0;
Здравствуйте, Sinclair, Вы писали:
S>Ну, вообще-то правильно — так: S>
S>catch(KeyNotFoundException knfe)
S>
"И эти люди запрещают мне ковыряться в носу!" (с) Кстати, кстати, в коде Janus "KeyNotFoundException" не используется ни разу, а вот защитная проверка с помощью .Contains() — используется. К чему бы это?
S>1. Джава sux: нам не нужен никакой гет, вместо этого используется синтаксически более прозрачный индексер
те же яйца, только в профиль. Только синтаксис индексеров слишком убогий, для использования в, например, ConcurrentMap. Рассмотрим метод V putIfAbsent(K key, V value), который атомарно устанавливает значение, если по ключу еще не было записи, или еще более сложный случай — "boolean replace(K key, V oldValue, V newValue)", который атомарно устанавливает значение, только если по ключу лежит определённый элемент. В рамки индексеров такая семантика уже не влазит. И получается — половина доступов к словарю по индексеру, а половина по методам.
Короче — проперти и индексеры — сакс
S>2. Джава sux: а если в словаре хранятся значения примитивного типа, то мы что будем возвращать? А что делать, если мы хотим намеренно сохранить null?
В джава нельзя положить в словарь примитивный тип, так что со вторым пунктом всё впорядке
S>3. Смоллток sux: это что, нам надо в каждом методе предоставлять параметры для разных исходов? А если я этого не сделал?
Есть метод "at:" который просто кидает a KeyNotFoundError в случае чего. Выбор за программистом.
S>4. Смоллток sux: а теперь давайте сравним значения из двух словарей по ключу, при этом отсутствующие в любом из словарей считаем одной и той же ситуацией: S>
S> if (aMapLeft[key] != aMapRight[key]) mismatches++;
S>
S>Как мы передадим один и тот же continuation в два метода?
Во-первых, как я написал выше, код можно записать на исключениях один в один с этим. Во-вторых, ты можеш передать хоть 10 разных блоков в 10 разных методов — возврат то сработает только для одного — до остальных дело просто не дойдёт. В третих, можно создать один блок, присвоить его переменной и передавать в оба метода-доступа. От использования исключений этот способ будет отличаться только более явным выражениям намерения — в случае внутренней ошибки, которая выкинет KeyNotFoundException это не будет защитано за mismatch. То есть, этот код аналогичен не твоему примеру с исключениями, а коду с пред-проверками с Contains():
foreach(string key in externalKeys) {
if (!aMapLeft.Contains(key)) mismatches++;
else if (!aMapRight.Contains(key)) mismatches++;
else if (aMapLeft[key] != aMapRight[key]) mismatches++;
}
S>Я не против continuation, но реализация на них ыполне прямолинейной логики обработки ошибок — weird.
имхо, это не обработка ошибок, а обработка штатных ситуаций! В Java ради этого, вон, проверяемые исключения прикрутили. Только оказалось, что смешивать обработку ошибок и штатных ситуаций не совсем удобно.
Здравствуйте, Геннадий Васильев, Вы писали:
ГВ>Здравствуйте, FDSC, Вы писали:
FDS>>Почему вам это сообщение показалось смешным?
ГВ>Этот постинг улыбнул меня своей пионерской наивностью. Я даже не нашёлся, что ответить.
Здравствуйте, FDSC, Вы писали:
M>>+1 Но что-то мне подсказывает что мейнстрим далеко не сразу примет альтернативу, даже если она появится..
FDS>Это он по инерции её не примет.
То есть, дело не в удобстве, а в инерции. Ну, наконецто.
Здравствуйте, Eugene Beschastnov, Вы писали:
EB>Здравствуйте, FDSC, Вы писали:
FDS>>>>Меня испугало то, что можно выйти откуда угодно. Это значит, что вызвав некоторую функцию я не буду уверен, что она вернёт управление
EB>>>Гхм... А как ты относишься к exception-ам?
FDS>>Положительно
EB>Извини, но я вижу в твоих словах некоторое противоречие.
Тут нет никаких противоречий. Exception возвращает управление вызывающей функции, а не к чёрту на кулички. И если уж ты его забыл обработать, так он вылезет тебе так, что ты сразу поймёшь — exception. А если функция просто куда-то не туда передаст управление, ищи её потом свищи.
Здравствуйте, Andrei N.Sobchuck, Вы писали:
ANS>Здравствуйте, Sinclair, Вы писали:
S>>Ну, вообще-то правильно — так: S>>
S>>catch(KeyNotFoundException knfe)
S>>
ANS>"И эти люди запрещают мне ковыряться в носу!" (с) Кстати, кстати, в коде Janus "KeyNotFoundException" не используется ни разу, а вот защитная проверка с помощью .Contains() — используется. К чему бы это?
S>>1. Джава sux: нам не нужен никакой гет, вместо этого используется синтаксически более прозрачный индексер
ANS>те же яйца, только в профиль. Только синтаксис индексеров слишком убогий, для использования в, например, ConcurrentMap. Рассмотрим метод V putIfAbsent(K key, V value), который атомарно устанавливает значение, если по ключу еще не было записи, или еще более сложный случай — "boolean replace(K key, V oldValue, V newValue)", который атомарно устанавливает значение, только если по ключу лежит определённый элемент. В рамки индексеров такая семантика уже не влазит. И получается — половина доступов к словарю по индексеру, а половина по методам.
А кто мешает сделать индексатор Collection.putIfAbsent[K key, V value] ?
В общем, тут нет никаких преимуществ, так же как и, видимо, нет недостатков
Здравствуйте, Andrei N.Sobchuck, Вы писали:
ANS>Здравствуйте, FDSC, Вы писали:
M>>>+1 Но что-то мне подсказывает что мейнстрим далеко не сразу примет альтернативу, даже если она появится..
FDS>>Это он по инерции её не примет.
ANS>То есть, дело не в удобстве, а в инерции. Ну, наконец-то.
Не понял умора?
Всё равно, если удобство есть, то "майнстрим" всё примет, как принял, например, ALGOL-60 или FORTRAN, а затем и C++ и Java
Здравствуйте, Andrei N.Sobchuck, Вы писали:
ANS>Здравствуйте, FDSC, Вы писали:
FDS>>А кто мешает сделать индексатор Collection.putIfAbsent[K key, V value] ?
ANS>-1. изменение семантики оператора [].
Да, изменение, дак тогда не синтаксис у индексаторов "убогий", а семантика им этого не позволяет. Синтаксис всё то же, что и методам позволяет делать. Я к этому и придрался