Re[14]: преимущества erlang-а?
От: johny5 Новая Зеландия
Дата: 03.02.06 02:21
Оценка:
VD>Думаю, что и большинству программистов нужен комплекс. Вопрос тольк в приоритетах.

так, я извиняюсь, на каком языке вы в конце концов остановились?
Re[19]: преимущества erlang-а?
От: EXO Россия http://www.az.inural.ru
Дата: 03.02.06 05:32
Оценка:
Здравствуйте, Arioch, Вы писали:
A>Вы же говорили про сотни гигов ?

Перечитайте внимательнее — речь про разное...

A>на 10/15 вроде бегают бесплатные Firebird, Postgress, etc


Они на бОльших размерах слишком тормозят.
А "универсальность SQL", без заточки на конкретную платформу, для больших задачь к сожалению миф...
То есть базу "на лету" в продукте не подменишь.
Да, в "нижнем сегменте" подошел бы POSTGRESS, в "верхнем" — MS SQL и ORACLE. Но ни то ни дугое, на всей линейке.
Мнезия воде бы необходимым масштабироывнием обладает:
— бесплатность и низкие требования к ресурсам на малых базах позволяет использовать ее в нижнем сегменте;
— по верхнему сегменту, известен пример проекта с базой примерно в 120 гиг (США, сеть казино. Мнезия стоит над BerkleyDB backend.)
Что касается работы на слабой технике (нижний сегмент), то тут нами уже все проверено. Как пойдут дела в верхнем сегменте будет ясно примерно через год. Пока видно только, что на базах порядка штук гиг она работает быстрее и MS SQL и Постгреса.
Правда следует признать, что оптимизатор запросов (в QLC) у нее более "тупой", чем у MS SQL и его чаще приходится "направлять пинками в нужную сторону". Больше всего напрягает пожалуй то, что QLC не использует статистику по таблице при выборе порядка использования индексов (хотя такая статистика есть).
На настоящий момент, мне представляется, что основное ограничение мнезии не по объему баз, а по количеству "плотно интегрированных" таблиц. Если архитектуру базы не удается разделить на достаточно обособленные блоки, не более чем по три десятка таблиц в каждом, то лучше взять какую-нибудь другую СУБД. Тогда как небольшом числе больших таблиц, мнезия вроде бы ведет себя весьма достойно.
Re[20]: преимущества erlang-а?
От: Gaperton http://gaperton.livejournal.com
Дата: 03.02.06 09:49
Оценка:
Здравствуйте, EXO, Вы писали:

EXO>Правда следует признать, что оптимизатор запросов (в QLC) у нее более "тупой", чем у MS SQL и его чаще приходится "направлять пинками в нужную сторону". Больше всего напрягает пожалуй то, что QLC не использует статистику по таблице при выборе порядка использования индексов (хотя такая статистика есть).


Так поправьте QLC, и научите его использовать статистику .
Re[21]: преимущества erlang-а?
От: EXO Россия http://www.az.inural.ru
Дата: 03.02.06 09:52
Оценка:
Здравствуйте, Gaperton, Вы писали:

G>Так поправьте QLC, и научите его использовать статистику .


Смотрели, там не так все просто — правки надо начинать с mnesia:select...
Вобщем, все может быть, но это не та вещь, которая делается "с наскоку".
( Не "на коленке", как выражается Влад.)
Re[15]: преимущества erlang-а?
От: Трурль  
Дата: 03.02.06 14:39
Оценка: 4 (1)
Здравствуйте, gandalfgrey, Вы писали:

G> Или биндинг к какому-нибудь симпатичному гую. Для GTK+, wxwindows и TCL уже есть...


Биндинг это фигня. EX11 идет верной дорогой.
Re[16]: преимущества erlang-а?
От: gandalfgrey  
Дата: 03.02.06 15:06
Оценка:
Здравствуйте, Трурль, Вы писали:

Т>Биндинг это фигня. EX11 идет верной дорогой.

Вопрос в том, когда Армстронг допинает его до работоспособного состояния.
А GTKNode уже работает. Причем так же удаленно
Re[28]: преимущества erlang-а?
От: VladD2 Российская Империя www.nemerle.org
Дата: 03.02.06 22:25
Оценка:
Здравствуйте, Gaperton, Вы писали:
...

В немерле можно все тоже самое. Погляди их разделы посвященные макросам и сам все поймешь.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[24]: преимущества erlang-а?
От: VladD2 Российская Империя www.nemerle.org
Дата: 04.02.06 02:02
Оценка:
Здравствуйте, Programmierer AG, Вы писали:


PA>При этом любой плюс-плюсник, который не первый день с СТЛ, сразу найдет ошибку, т.к. знает, что из этого читать не надо.


А ты поробуй в итератор int-переменную подсунуть. Забавное, надо признать зрелище.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[24]: преимущества erlang-а?
От: VladD2 Российская Империя www.nemerle.org
Дата: 04.02.06 07:34
Оценка:
Здравствуйте, the_void, Вы писали:

_>Очень интересно, какую ошибку надо сделать, чтобы так подумать

_>Как правило, все сообщения об ошибках типизации в OCaml сводятся к
_>This expression has type ... but is here used with type ...

Реальная ошибка была черт знает где. А мен показывали совсем в другую степь.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[15]: преимущества erlang-а?
От: VladD2 Российская Империя www.nemerle.org
Дата: 04.02.06 07:34
Оценка:
Здравствуйте, johny5, Вы писали:

J>так, я извиняюсь, на каком языке вы в конце концов остановились?


Дык я еще не остановился.

Для рельных программ пока что использую C# 2.0.

Если же говорить о том что мне нравится, то скорее всего это Nemerle. В принципе мне так же понравилась Скала, но лично мне ближе рантайм дотнета, а Скала заточена на Яву.

Традиционные ФЯ меня как-то не очень вдахновляют. Но если бы заставили выбирать именно из них, то наверно я бы остановился на ОКамле. В прочем, сложность у него тоже явно избыточная. И синтаксис больно не привычен для меня.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[18]: преимущества erlang-а?
От: VladD2 Российская Империя www.nemerle.org
Дата: 04.02.06 07:34
Оценка:
Здравствуйте, EXO, Вы писали:

EXO>Да нет, сейчас на C#.


Каую-то ты фигню говоришь. Нельзя было писать на C# в VS6. Там был только VC++ 6. Ну, отдельным продуктом еще шел VB6.

EXO>Я хорошо помню, какое сопротивление яве было в сообществе. И как тогда старались рекламисты микрософт.


С очевидцами не спорят.

VD>>Если ты помнишь, то Яву талкали как средство создания аплетов, то есть как замену скриптам.


EXO>Очень недолго. Потом IBM громко закричал о северных задачах, а MS поддержал.


Ага. Чучуть. Года 4.

EXO>Кстати, посмотрел ANTLD. И обнаружил, что "знакомые все лица".

EXO>От своего предка — PCCTS он ушел не слишком далеко (а с последним я года полтора возился и глюки его знаю).

PCCTS это довольно древняя вещь. Ее автор на PCCTS дисер защитил. Потом правад, как я понил, в помоуйку пол дисера отправил. Сейчас отправляет оставшуюся часть переделывая АНТЛР на ДКА.

EXO>Так вот — наиболее критичный глюк основного алгоритма не исправлен.

EXO>Там токенайзер начинал вести себя странно, если требовалась глубина анализа больше 2.

Незнаю, не знаю. Для многих случаев он довольно большое К давал. А я так в Коке К = 1 использую и никаких проблем. Ну, а у АНТАЛР-а для шарпа обычно что-то полурукопашное использовалось.

EXO>То есть корректно компилировались только простые и очень однозначные грамматики.


Ну, да. Так и есть. Видимо по этому на сайте АНДЛР-а лежат только очень простые грамматики: С++, C#, Ява, SQL...

А главное, что лексер это такая сложная вещь! Что там какая-то грамматика для C# или C++?

VD>>А каково Эрлэнгу и его ранайму?


EXO>Нормально.

EXO>Вот у меня сейчас на разработческой тачке для отладки запущен сервер + мнезия (с базой около полугига) + вебсервер.
EXO>Суммарно в памяти занимают 30 мег. При этом кеши мнезии не урезаны. Можно уплющить мег до 12, проиграв по быстродействию где-то в четверо. Если учесть, что на микрописишках базы обычно только "аварийного хранения" (дня на 4 — если в праздники оборвется связь с центральным сервером). То вполне можно жить.

А, ну ясно. Для БД в 500 метров кэш 12 метров. Правильно, зачем зря память расходывать.

В общем, ты меня извини, но 12 метров для такой БД это сесть на винт. Ну, и 30 метров для машины с 64 метрами — это уже очень на мало. А ты ведь только одного пользователя подключил. Подключись к серверу 100 параллельных клиентов и сдохнет твоя 64-метровая машинка. А так, у меня тоже ничего не делающие экзешники много памяти не жрут при запуске. Но вот на рашем сервере кэш БД 1.5 гига, и веб-сервер жрет метров 300-500. Не думаю, что Эрлинг тут что-то иправил бы.


EXO>То, что оно пока не продукт промышленного качества.


Да? А Новел то незнает. Зарелизили 1.х совместимую версию.

EXO>Вопрос в самих этих объемах.

EXO>В Штатах — да, граница где "лицензия sql уже не тяготит" проходит где-то в районе 4 гиг. В России денег у предприятий поменьше будет (некоторые сектора типа нефте-газа я не считаю). И граница эта колеблется примерно в районе 10-15 гиг.

Что то я не понял этих вычислений лицензий в гигах.
А главное не понял, что же это за контора такая с 15 гигами информации и без денег? Видимо прийдется ей за 100 рублей диски покупать раз она в игрушки играется.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[19]: преимущества erlang-а?
От: VladD2 Российская Империя www.nemerle.org
Дата: 04.02.06 07:34
Оценка:
Здравствуйте, Arioch, Вы писали:

A>Вы же говорили про сотни гигов ?

A>на 10/15 вроде бегают бесплатные Firebird, Postgress, etc

В раскорячку они бегают.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[25]: преимущества erlang-а?
От: VladD2 Российская Империя www.nemerle.org
Дата: 04.02.06 07:34
Оценка:
Здравствуйте, EXO, Вы писали:

EXO>Вот здесь похоже и есть точка непонимания.

EXO>У меня например, эта разница около 40%
EXO>Все остальные элементы спора — уже следствия.

Возможно. Остается узнать в какую сторону отличаются наш 1 раз.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[25]: преимущества erlang-а?
От: VladD2 Российская Империя www.nemerle.org
Дата: 04.02.06 07:34
Оценка: :)
Здравствуйте, Lazy Cjow Rhrr, Вы писали:

LCR>Прежде чем лезть в чужой монастырь со своим уставом, полезно сначала понять чужую культуру и проникнуться чужими ценностями. Они с очень большой вероятностью могут быть не хуже и не лучше, а быть просто другими.


Прежде чем учить других чему-то неплохо удостовериться, что они этого не знают. Историю CAR/CDR я знаю не хуже тебя.

Так вот я не люблю религии. И в моностыри/церкви если и хожу, то только исключительно чтобы поглядеть на их был. При этом считаю своим неотемлемым прваом высказывать свое мнение сформированное на базе увиденного. Ну, а все кто этим недоволен идут в лес.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[25]: преимущества erlang-а?
От: VladD2 Российская Империя www.nemerle.org
Дата: 04.02.06 07:34
Оценка:
Здравствуйте, gandalfgrey, Вы писали:

G>Дык, я говорю не о скорости написания КОНЕЧНОГО ПРОДУКТА, а о скорости писания кода ! Вот в этом примере с редактором — ежели обьем кода на каждом языке разделить на время написания редактора на этом языке, не ролучатся ли близкие значения ?


Нет не получатся. Дело в том, что даже одинаковый объем кода на шарпе пишется быстрее чем на плюсах. А уж меньший и подавно.

Простой пример. Чтобы реализовать интерфейс на С++ мне нужно вдолбить все его методы. При этом никакого комплита или помощи я не дождусь. Лучшее что я могу сделать — это отыскать определение интерфейса и скопипэстить его в класс реализующий этот интерфейс. Далее мне нужно вручную поправить все описания и только потом приступить к кодированию методов.

На C# сегодня я делаюс следующие действия:
1. Вбиваю буквы "cl".
2. Компличу слово "class" одним нажатием.
3. Жму таб. Получаю заготовку класса.
4. Вписываю " : " и начальные буквы интерфейса.
5. Компличу имя интерфейса.
6. Жму Ctrl+Alt+F10 и выбираю как я буду реализовывать интерфйс.
Все! Все методы описанне в интерфейсе но не реализованные в классе автоматически добавляются в класс. Причем мне уже не надо их править, так как они уже корректны.

Точно так же на менее многословном языке реально я буду вынужден надолбить куда бльше текста, чем на Шарпе, но с поддержкой IDE.

Ну, и главное в "надалбывании" кода. При процессе надалбывания основное время тратится на то, чтобы вспомнить какие методы нужно вызвать, их сингнатуру и т.п. Конечно хорошо, что интерпетаторы позволяю быстро поправиться, но лучше если я просто буду вводить сразу нужный мне код. Комплит как раз предоставляет списки метовов/свойств и их краткое описание. В дополнении среда еще позволяет быстро найти хэлп по нужной функции (ведь она знает, что это за функия!).

Ускоряют процесс оздания ПО и визуальные дизайнеры, вроде дизайнера классов и дизайнера форм/веб-фарм/компонентов. Например, мне не надо разбираться с тем, что за свойства нужно задать диалогу отрытия файлов. Я просто брошу соотвествующий компонет куда надо и настрою его свойства визуально.

К тому же не надо забывать, что скорость разработки в большинстве случаев не упирается в скорость долбления кода. Он упирается такие факторы как простота отладки, простота модификации кода, простота серьезного рефаторинга. Если язык статически типзирован и имется хорошая среда, то рефакторино проходит очень просто и не вызвает серьезных проблем. Типобезопасность и хрооший отладчик обеспечивает поскую отладку (а зачастую типобезопасность в вообще избавляют от необходимости отладки).

Даже такая казалось бы банальная вещь как качественный кол-стрэк при рантайм-ошибке уже резко сокращает отладку.

В итоге казалось бы что надолбить я могу совершенно одинаковое количество текста, но реально наличие хорошей IDE и свойства языка позволяют мне многократно ускорять процесс создания ПО.

G>А я говорю о том, что для каждого человека произодительность слабо меняется, хотя очень сильно меняется от человека к чкловеку.


Она меняется и от человека к человеку, и от языка и его среды. Ты же изначаль озвучил тезис, что программист вообще набивает энное количество кода не зависимо от языка. А это не так.

Это мнение родилось у, извинясь за выражение, старперов которые никогда не видели современной среды разработки. Они привыкли, что все нудно долбить руками, средств контроля почти нет, а отладчик имеет такое качесвто, что лучше бы его не было. Да, при таком расскладе наверно они правы. Но им бы вылезти из своего локального каменного века. Тогда бы они узнали, что люди живут по другому. Ну, по крайней мере многие из них.

VD>>Я готов отказаться от более продвинутого языка если есть менее продвинутый, но с отличной поддежкой среды. Ведь среда может компенсировать многие проблемы и дать огромный выирыш.

G>Это весьма редкий случай, как мне кажется. Обычно люди не придают заметного значения наличию или отсутствию среды. Разве что для ваяния ГУЯ

Это "обычно" твое локальное частное мнение. Уверяю тебя, что ты уже в меньшинстве. И со временем крук людей которые так считают будет все уже (в процентном отношении по крайней мере).

VD>>Простая арифметика. 4 < 20. Ускорившись в 4 раза, я замедлюсь в 20. В тоге я все равно относительно замедлюсь. В бизнесе это называется упущенной выгодой. Ее може быть не заметно, но она есть.

G>А почему 20 ? Половина рабочего времени — это рабочий день / 2. То-есть будет общее ускорение в 4 / 2 раза.

20 потому что я в 20 раз более продуктивен используя продвинутую IDE и заточенную под современный язык. Вот откуда ты взял половину рабочего времени?

VD>>И я с трудом их читаю. И еще миллионы людей. Так что это общие особенности. И уверен, что им есть вполен конкретное обяснение.

G>Но очень многие читают их без какого-либа напряга. И этому тоже должно быть обьяснение. Подозреваю, что это связано со зрением. Не остротой зрения, а чем-то другим.

Очень НЕ многие. Ты живешь в каком-то своем мире. Попробуй создать голосоание на этом сайте. Увидишь, что согласных с тобой не наберется и процента.

Просто сражаются в форумах еденицы вроде меня. Большинство людей или вообще не понимает, то о чем мы тут ведем беседу. Или понимает, но не может/не хочет принять.

Вот погляди на рекцию среднего мэйнстримщика на функциональный стиль Re: System.IO
Автор: mihailik
Дата: 24.01.06
. Или вот Re: Nemerle рулит! :)
Автор: Константин Ленин
Дата: 02.02.06
.

VD>>Огромное количество. Одни соглашения о названих CAR/CDR чего стоят? Ну, почему не H/T хотя бы? Я уже не говорю, о том, что более длинные head/tail хотя и длиннее, но реально намного бы повысили бы простоту чтения.

G>Ну, Лисп это еще не все языки

Несомненно не все. Но погляди как ревносно защищают апологеты Лиспа его бессмысленные CAR/CDR?!

G>
G>any(Pred, [H|T]) ->
G>    case Pred(H) of
G>        true  ->  true;
G>        false ->  any(Pred, T)
G>    end;
G>any(Pred, []) ->
G>    false.
G>

G>Несколько более читаемо, правда ?

Да, несомненно. Но тоже толкь после привчки. И еще прийдется объяснить, что значит H/T. Это для тебя очевидно, что это хвост и голова. А хля кого-то это HTML и TeX.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[25]: преимущества erlang-а?
От: VladD2 Российская Империя www.nemerle.org
Дата: 04.02.06 07:34
Оценка:
Здравствуйте, CrazyPit, Вы писали:

CP>Есть синонимы first & rest. А Car cdr удобно, т.к. есть функции типа caddr аналогичные (car (cdr (cdr ...)).


Ничего удобного в этом нет. Это истарический Ляп. Что caddr, то тоже самое можно изобразить индексированием или функцией.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[22]: преимущества erlang-а?
От: VladD2 Российская Империя www.nemerle.org
Дата: 04.02.06 07:34
Оценка:
Здравствуйте, CrazyPit, Вы писали:

CP>Если имеете ввиду лисп. То макрос тоже может использовать любой бибилотечный код, и вообще всё что угодно.

CP>Вполне можно написать макрос который в момент компиляции обращаеться к астрологическому интернет ресурсу. И генерирует различный код взависимсости от фазы луны и положения марса относительно солнца

ОК. Но овспользоваться информацией о типах и другой семантикой он не может, так как не может взаимодействовать с компилятором. Одного этого уже достаточно, чтобы считать макросы немерла более мощьной вещью.

Кстати, лисповские макросы могут разбирать входяший текст. Например, в Нэмерле допустим о следущее расширение:
def x = xml(<a><b/><a>)

то есть после xml( идет уже не Нэмерэловский код, а ХМЛ. И Нэмерел позволяет макрос xml() разобрать его как он хочет и вернуть AST соотвествющее инициализации графа объектов описывающего хтот ХМЛ.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[23]: преимущества erlang-а?
От: VladD2 Российская Империя www.nemerle.org
Дата: 04.02.06 07:34
Оценка:
Здравствуйте, CrazyPit, Вы писали:

CP>Да немерле тоже очень хороший язык, просто пока менее применяемый — поэтому так.


Новый. Тут не поспоришь. Но все же он в той стадии когда с ним можно сравнивать.

CP> Только у него есть один большой недостаток и одновременно большое достоинство — он под .NET.


Ну, да. Кому как.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[27]: преимущества erlang-а?
От: VladD2 Российская Империя www.nemerle.org
Дата: 04.02.06 07:34
Оценка:
Здравствуйте, Programmierer AG, Вы писали:

PA>Я, повторюсь, Немерле не видел. Просто мне различие уровня, на котором можно метапрограммировать в Немерле и в Camlp4, показалось существенным. Например, было бы неплохо, если бы в потоках не надо было отличать выражения-потоки и выражения-элементы синтаксически:

PA>
PA>[<'elem1;stream1;'elem2;stream2>]
PA>

PA>Это можно сделать только при наличии информации о типах. В данном случае это мелочь, но могут быть случаи, когда это окажется серьезным препятствием.

Именно так. Ниже я привел пример реализации C#-ного foreach-а на макросах немерла. Это код не из примеров которые конечно просые и даже работают но не дают такого же качества как контрукция встроенная в язык. А этот макрос проводит кучу дополнительного анализа и выдает тучу диагностики если что. При этом он строит код в зависимости от типа леального выражения. В общем, надесь, он понятен и тем кто не знает Нэмерел:
/**
 * The 'foreach' macro introduces a construction equivalent
 * to C#'s 'foreach' keyword, iterating over a collection.
 */
macro @foreach (inexpr, body)
syntax ("foreach", "(", inexpr, ")", body)
{
    match (ListComprehensionHelper.ExpandRange (inexpr, body)) {
        | Some (expr) => Nemerle.Imperative.Return (expr)
        | None => {}
    }

    def (iter, collection) =
        match (inexpr) {
            | <[ $i in $c ]> => (i, c)
            | e =>
                Message.FatalError ($ "the syntax is 'foreach (x in collection)', "
                                                            "got $e");
        }
        
    def typer = Macros.ImplicitCTX ();
    def tcollection = typer.TypeExpr (collection);

    // build the body of loop (may contain additional matching)
    def build_definition (val) {
        match (body) {
            | <[ match ($(null)) { ..$cases } ]> =>
                match (iter) {
                    | <[ $(x : name) ]> when char.IsLower (x.Id[0]) | <[ (..$_) ]> => ()
                    | _ => Message.FatalError ("only simple names available in pattern"
                                                                         " of foreach with direct matching")
                }

                <[ def $iter = $val; 
                     match ($iter) { ..$cases } 
                ]>

            | _ =>
                def mat =
                    match (iter) {
                        | <[ $pat :> $ty ]> =>
                            <[ match ($val :> $ty) { | $pat => $body; () | _ => () } ]>
                        | _ =>
                            <[ match ($val) { | $iter => $body; () | _ => () } ]>  
                    }
                mat.cases.Iter (fun (x : PT.MatchCase) { x.disable_warnings = true });
                mat
        }
    }

  // here we choose if we want to use enumerator pattern
  // of access GetEnumerator through IEnumarable
  // http://www.jaggersoft.com/csharp_standard/15.8.4.htm
  def decide_enumerator_pattern (tyinfo) {
    def all = tyinfo.LookupMember ("GetEnumerator");
    
    def choosen = List.Exists (all, fun (mem : IMember) {
      | meth is IMethod when !meth.IsStatic && meth.GetParameters ().IsEmpty =>
        match (meth.ReturnType) {
          // FIXME: do additional conservative checks              
          | MType.Class (tc, _) when
            !tc.LookupMember ("MoveNext").IsEmpty &&
            !tc.LookupMember ("Current").IsEmpty => true
            
          | _ => false
        }
      | _ => false
    });
    if (choosen)
      <[ $(tcollection : typed).GetEnumerator () ]>
    else
      <[ ($(tcollection : typed) : System.Collections.IEnumerable).GetEnumerator () ]>
  }

  typer.DelayMacro (fun (fail_loudly) {
    match (tcollection.Type.Hint) {
      | Some (MType.Class (tc, args)) =>
        if (tc.SuperType (InternalType.Nemerle_list_tc).IsSome) {
          def arg = List.Head (args);
          def definition = build_definition (<[ x ]>);
          Some (<[
            // we explicitly set parameter type to list, because collection's type
            // can be more specific (list.Cons, etc.)
            ($(PT.Name.Global ("_N_break") : name) : {
              def foreach_loop (_ : list [$(arg : typed)]) {
                | x :: xs =>
                  $(PT.Name.Global ("_N_continue") : name) : {
                    $definition;
                  }
                  foreach_loop (xs)
                | _ => ()
              }
              foreach_loop ($(tcollection : typed))
            })
          ]>)
        }
        else {
          def init_body = decide_enumerator_pattern (tc);

          def is_disposable = 
            typer.JustTry (fun () {
              def expr = typer.TypeExpr (init_body);
              expr.Type.Require (<[ ttype: System.IDisposable ]>)
            });

          def finally_body = 
            if (is_disposable)
              <[ (enumerator : System.IDisposable).Dispose () ]>
            else
              <[
                match (enumerator) {
                  | x is System.IDisposable => x.Dispose ();
                  | _ => ()
                }
              ]>;

          def definition = build_definition (<[ enumerator.Current ]>);

          Some (<[ 
            def enumerator = $init_body;
            $(PT.Name.Global ("_N_break") : name) : {
              def loop () {
                when (enumerator.MoveNext ()) {
                  $(PT.Name.Global ("_N_continue") : name) : {
                    $definition;
                  }
                  loop ();
                }
              }
              try { loop () } 
              finally { $finally_body }
            }
          ]>)
        }

      | Some (MType.Array (_ , rank)) =>
        def indices  = array (rank);
        def lengths = array (rank);
        for (mutable i = 0; i < rank; ++i) {
          indices [i] = Macros.NewSymbol ();
          lengths [i] = Macros.NewSymbol ();
        }
        def indices_list = List.RevMap (List.FromArray (indices), fun (x) {
            <[ $(x : name) ]> 
        });
        def build_loops (depth)  {
          /// build expression defining iteration symbols
          | 0 => build_definition ( <[ cached_collection [..$indices_list] ]> )
          | n => 
            def idx = indices [n - 1];
            <[ for (mutable $(idx : name) = 0; 
                    $(idx : name) < $(lengths [n - 1] : name);
                    ++ $(idx : name) ) 
                 $(build_loops (n - 1)) 
            ]>
        }
        mutable sequence = [ <[ $(build_loops (rank)) ]> ];
        if (rank == 1) 
          sequence = <[ def $(lengths [0] : name) = cached_collection.Length ]> :: sequence;
        else
          for (mutable i = rank - 1; i >= 0; --i)
            sequence = <[ def $(lengths [(rank - 1) - i] : name) = cached_collection.GetLength ($(i : int)) ]>
                       :: sequence;

        sequence = <[ def cached_collection = $(tcollection : typed) ]> :: sequence;
        Some (<[ { .. $sequence } ]>)

      | t =>
        when (fail_loudly) {
          def guess =
            match (t) {
              | Some (t) => $ "current best guess about the type is $t"
              | None => "the compiler has no idea what the type might be"
            }
          Message.Error ($ "collection in foreach must be an array or "
                           "type implementing enumerator pattern, $guess");
          Message.Hint ("try specifing the type directly using 'expr : SomeType'");
        }
        None ()
    }
  })
}
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[26]: преимущества erlang-а?
От: gandalfgrey  
Дата: 04.02.06 08:26
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Нет не получатся. Дело в том, что даже одинаковый объем кода на шарпе пишется быстрее чем на плюсах. А уж меньший и подавно.

Одинаковый по количеству строк ? Или все же одинаковый по функциональности обьем ?

VD>Точно так же на менее многословном языке реально я буду вынужден надолбить куда бльше текста, чем на Шарпе, но с поддержкой IDE.

А если тебе надо сделать то, для чего нет визардов в среде ? Придется ведь просто топтать клаву, как и делают ретрограды вроде меня ! 8))

VD>Ну, и главное в "надалбывании" кода. При процессе надалбывания основное время тратится на то, чтобы вспомнить какие методы нужно вызвать, их сингнатуру и т.п. Конечно хорошо, что интерпетаторы позволяю быстро поправиться, но лучше если я просто буду вводить сразу нужный мне код. Комплит как раз предоставляет списки метовов/свойств и их краткое описание. В дополнении среда еще позволяет быстро найти хэлп по нужной функции (ведь она знает, что это за функия!).

Навигатор по TAGS и хэлп у меня подцеплен к ФАРу, так что тут разница небольшая

VD>Ускоряют процесс оздания ПО и визуальные дизайнеры, вроде дизайнера классов и дизайнера форм/веб-фарм/компонентов. Например, мне не надо разбираться с тем, что за свойства нужно задать диалогу отрытия файлов. Я просто брошу соотвествующий компонет куда надо и настрою его свойства визуально.

Вот уж что меня мало заботит ! ГУЙ делают другие люди. На чем они его делают, меня не волнует, лишь бы они соблюдали протокол обмена.

VD>К тому же не надо забывать, что скорость разработки в большинстве случаев не упирается в скорость долбления кода. Он упирается такие факторы как простота отладки, простота модификации кода, простота серьезного рефаторинга. Если язык статически типзирован и имется хорошая среда, то рефакторино проходит очень просто и не вызвает серьезных проблем. Типобезопасность и хрооший отладчик обеспечивает поскую отладку (а зачастую типобезопасность в вообще избавляют от необходимости отладки).

Я не верю в приличный АВТОМАТИЧЕСКИЙ рефакторинг. Ручной и тот чаще всего бывает довольно бессмысленным

VD>Даже такая казалось бы банальная вещь как качественный кол-стрэк при рантайм-ошибке уже резко сокращает отладку.

Именно ! В языках, которые я использую чаще всего, это есть

VD>Это мнение родилось у, извинясь за выражение, старперов которые никогда не видели современной среды разработки. Они привыкли, что все нудно долбить руками, средств контроля почти нет, а отладчик имеет такое качесвто, что лучше бы его не было. Да, при таком расскладе наверно они правы. Но им бы вылезти из своего локального каменного века. Тогда бы они узнали, что люди живут по другому. Ну, по крайней мере многие из них.

Ну, как бы это так сказать...Представление о современной среде разработки у всех разное. ОЧЕНЬ многие используют Емакс — и счастливы, поскольку там есть все. Другие используют АНЖУТУ и ее клоны — и тоже довольны. Говорят, есть люди, которые используют Вижуал Студию,... 8)

VD>Это "обычно" твое локальное частное мнение. Уверяю тебя, что ты уже в меньшинстве. И со временем крук людей которые так считают будет все уже (в процентном отношении по крайней мере).

Это круг моих знакомых, занимающихся самыми разнообразными задачами. Как-то так получилось, что отсутствие среды их не сильно удручает.

VD>20 потому что я в 20 раз более продуктивен используя продвинутую IDE и заточенную под современный язык. Вот откуда ты взял половину рабочего времени?

Про половину ты писал : "полдня переключаются между консолями". А вот откуда ускорение в 20 раз за счет ИДЕ ? В десятки процентов я еще могу поверить, и то сильно напрягшись.

VD>Просто сражаются в форумах еденицы вроде меня. Большинство людей или вообще не понимает, то о чем мы тут ведем беседу. Или понимает, но не может/не хочет принять.

Нууу...Тут нужна статистика. Без нее сложно что-то утверждать/возражать.

G>>
G>>any(Pred, [H|T]) ->
G>>    case Pred(H) of
G>>        true  ->  true;
G>>        false ->  any(Pred, T)
G>>    end;
G>>any(Pred, []) ->
G>>    false.
G>>


VD>Да, несомненно. Но тоже толкь после привчки. И еще прийдется объяснить, что значит H/T. Это для тебя очевидно, что это хвост и голова. А хля кого-то это HTML и TeX.

Все, что с большой буквы — переменные. С маленькой атомы ( в том числе и имена функций )
Если бы было написано Head/Tail, было бы сильно лучше ?
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.