Оберон-технология: особенности и перспективы |
Тематика обсуждения: Оберон-технология. Особенности, перспективы, практическое применение.
Всего в теме 6256 сообщений
Добавить свое сообщение
Отслеживать это обсуждение  Обсуждение из раздела Школа ОБЕРОНА
№ 5676 21-10-2007 05:40 |  |
Ответ на »сообщение 5674« (Илья Ермаков)
___________________________
return_t result( str );
do
result = prs_lexical().parse( result.str, lexers::keyword_t()
if ( result.lexeme == LEX_DEF )
result = prs_def().parse( result.str, params );
while ( result.lexeme == LEX_DEF );
Илья, Вы только что испортили программу...
Не имеет значение, что возвращает prs_def().parse( result.str, params ) в result.lexeme, важно, что она модифицирует result.str, которое используется на новом шаге итерации...
№ 5675 21-10-2007 05:27 |  |
Ответ на »сообщение 5673« (Стэн)
___________________________
Ответ на »сообщение 5671« (Илья Ермаков)
___________________________
Так что, думаю, что стоит более умеренно отзываться о самоучках...
А чем я обижал самоучек? Сам такой был.
Можно винить только тех, кто так и не дал развиться системе обучения программированию в школах, которую в 80-х начал строить Ершов. А потом попёр замкнутый круг - сами не научились, научить было некому, потом сами пошли учить... Ужас.
№ 5674 21-10-2007 05:24 |  |
Ответ на »сообщение 5672« (Стэн)
___________________________
Ответ на »сообщение 5671« (Илья Ермаков)
___________________________
Вот такой пример:
return_t result( str );
// -
do
result = prs_lexical().parse( result.str, lexers::keyword_t()
// -
if ( result.lexeme == LEX_DEF )
result = prs_def().parse( result.str, params );
else
return result;
while ( true );
Это WHILE, но с BREAK (RETURN) внутри. Сможете его переформулировать так, чтобы код стал проще (без доп. логических переменных и еще одного if), но без использования return?
Вообще, этот цикл слишком предосудительным я не считаю - это "бесконечный" цикл с одним выходом из середины. Обероновский LOOP.. EXIT END (который полезен, правда, ну ооочень редко).
Однако я бы написал условие окончания цикла явно в том месте, где ему и положено быть, ибо реальной нужды в выходе из середины здесь нет (выход-то в конце, прямо рядом с точкой проверки условия цикла :-) ):
return_t result( str );
do
result = prs_lexical().parse( result.str, lexers::keyword_t()
if ( result.lexeme == LEX_DEF )
result = prs_def().parse( result.str, params );
while ( result.lexeme == LEX_DEF );
№ 5673 21-10-2007 05:24 |  |
Ответ на »сообщение 5671« (Илья Ермаков)
___________________________
>>> Например, в спорте или музыке - если человек будет учиться сам, то у него будет неправильная техника, которая может и срабатывать, но рано или поздно будет серьёзным тормозом).
А Вы знаете, что наши каратисты очень часто побеждают японцев на чемпионатах, хотя япония считается родиной каратэ (для некоторых стилей)? А знаете почему? Потому, что в японии четкое следование традиции и технике непреложная истина, а наши допускают "творческое отступление от канона", поэтому более эффективны...
А вообще, вся Ваша позиция проистекает из того, что Вы отказываете людям в возможности проведения самоанализа. Да, выбрал человек неправильный метод, наступил на грабли, но если он задает себе вопрос о том, а почему так случилось, то он может исправиться. Так что, думаю, что стоит более умеренно отзываться о самоучках...
№ 5672 21-10-2007 05:15 |  |
Ответ на »сообщение 5671« (Илья Ермаков)
___________________________
>>> В ветке по ФП уже был спор - я просил привести примеры циклов, для которых переход к WHILE вызовет удлиннение кода (т.е. дополнительные if внутри и доп. логические переменные).
Вот такой пример:
return_t result( str );
do
result = prs_lexical().parse( result.str, lexers::keyword_t()
if ( result.lexeme == LEX_DEF )
result = prs_def().parse( result.str, params );
else
return result;
while ( true );
Это WHILE, но с BREAK (RETURN) внутри. Сможете его переформулировать так, чтобы код стал проще (без доп. логических переменных и еще одного if), но без использования return?
№ 5671 21-10-2007 04:41 |  |
Ответ на »сообщение 5670« (Стэн)
___________________________
Ответ на »сообщение 5666« (Илья Ермаков)
___________________________
И стиль у них одинаковый - закатать полный проход FOR, а потом искать место, когда бы с него спрыгнуть через BREAK.
А что, с WHILE не так? Ищется место, куда бы воткнуть дополнительное условие завершения...
Вас не понял :-) А разве у WHILE не только одно место, куда можно воткнуть условие, обратное к условию завершения? :-)
В ветке по ФП уже был спор - я просил привести примеры циклов, для которых переход к WHILE вызовет удлиннение кода (т.е. дополнительные if внутри и доп. логические переменные). То, что народ приводил, было разными вариациями линейного поиска (они даже этого не замечали) - который переписывается простым и очевидным способом в WHILE, и никакой if (который есть внутри foreach) становится не нужен.
Сами подумайте - есть цикл. Конструкция, тело которой выполняется несколько раз. И вдруг большую часть этого тела занимает if с некоторым действием, которое выполнится ТОЛЬКО ОДИН РАЗ - перед break. Чужеродное тело, которое к циклу вообще никакого отношения не имеет - это действие ПОСЛЕ, по завершении линейного поиска. Неужели ничего не настораживает?
В интеллектуальном расизме Вас что-ли обвинить?!.. Может быть раскроете эту тему по подробнее, на каком это основании Вы так пренебрежительно и надменно отзываетесь о весьма широком круге людей?
Либо, чтобы Ваши слова небыли пустым звуком, может приведете результаты соответствующих исследований...
?? Я не говорил о круге людей, более широком, чем тот, о котором я говорил.
А говорил я о наблюдениях среди студентов-самоучек. О том, что FOR-BREAK - это их общая находка. И общая особенность - неумение правильно алгоритмировать. И о том, что эта корреляция лично для меня достаточна для того, чтобы считать FOR-BREAK плохой конструкцией (потому что "интуитивные находки", самый очевидный для новичков путь чаще всего плох. Например, в спорте или музыке - если человек будет учиться сам, то у него будет неправильная техника, которая может и срабатывать, но рано или поздно будет серьёзным тормозом) . И даже подчеркнул, что не говорю о какой-то причинно-следственной связи между использованием FOR-BREAK и неумением писать хорошие программы его использующих из круга профессиональных программистов.
№ 5670 21-10-2007 04:28 |  |
Ответ на »сообщение 5666« (Илья Ермаков)
___________________________
>>> И стиль у них одинаковый - закатать полный проход FOR, а потом искать место, когда бы с него спрыгнуть через BREAK.
А что, с WHILE не так? Ищется место, куда бы воткнуть дополнительное условие завершения...
>>> У меня есть многочисленные наблюдения, что использование FOR-BREAK - интуитивная находка всех самоучек. И наблюдения, что строить алгоритмы грамотно с первого раза (а не отладкой и подгонкой) они не способны.
>>> Что-то на уровне общего жизненного опыта мне подсказывает, что если какая-то штука очевидна самоучкам и при этом использование этой штуки обычно коррелирует с неумением получать правильный результат (не надо проводить причинно-следственной связи, достаточно зафиксировать факт корреляции), то эта штука является опасной ошибкой.
В интеллектуальном расизме Вас что-ли обвинить?!.. Может быть раскроете эту тему по подробнее, на каком это основании Вы так пренебрежительно и надменно отзываетесь о весьма широком круге людей?
Либо, чтобы Ваши слова небыли пустым звуком, может приведете результаты соответствующих исследований...
№ 5669 21-10-2007 04:14 |  |
Ответ на »сообщение 5661« (pepper)
___________________________
Ответ на »сообщение 5634« (Илья Ермаков)
___________________________
Илья, ты серьезно предпочел бы "лечь под нож" компьютера, запрограммированного врачом (пусть даже на обероне), чем профессиональным программистом?
Да. С одним важным "но", про которое я с самого начала говорил: для этого врача программирование медицинских систем должно быть не случайным эпизодом, а постоянной работой - "программирующий врач".
Потому что все лучшие программисты, которых я лично знаю - это программисты, которые получили основное образование не по ИТ-специальности. Чаще, конечно, физмат. Но уверен, что в качестве фундамента может быть и другое не гуманитарное образование. Лингвистика, к примеру. При этом приходилось беседовать на программисткие темы с одним старым другом - медиком (была там одна идейка), который вообще никогда не занимался программированием (даже на уроках в школе). Так вот, способность его ухватывать самую суть, которую средний программёр чаще всего не замечает, меня поражала постоянно. Сказывается незамусоренность мозгов всяким хламом (а в нашей отрасли хлама больше, чем в какой другой - одну область веб-технологий взять...).
№ 5668 21-10-2007 04:08 |  |
Ответ на »сообщение 5659« (pepper)
___________________________
Ответ на »сообщение 5654« (AVC)
___________________________
P.S. Вирт проектирует язык "от компилятора", выставляя для компилятора определенные критерии (простота, прежде всего). Этим все очень хорошо объясняется.
Во первых, Вы утрируете, хотя доля правды есть.
Во-вторых, с простотой следует надёжность и уверенность в компиляторе.
Покажите мне на компилятор С++, в котором нет ошибок и который полностью соответствует стандарту.
№ 5667 21-10-2007 04:06 |  |
Ответ на »сообщение 5657« (Стэн)
___________________________
Ответ на »сообщение 5655« (AVC)
___________________________
А вот если бы были специализированные циклы, от которых по малопонятным причинам предлагают отказываться, то ошибок могло бы быть меньше, так как компилятор берет на себя часть проверок...
Я ничего не имею против цикла FOR. И даже против FOREACH. Только против BREAK. Но я прекрасно понимаю, что если Вам дали в языке FOREACH, но не дали его версии для итерирования по элементам с явным указанием условия линейного поиска, то рука у Вас сама тянется к BREAK :-) И плюёте Вы на все теоретические аргументы.
В Eiffel вообще в цикле синтаксически выделены отдельные части для условия, изменения и инварианта. Вот вам спец. синт. конструкция, но ГРАМОТНАЯ.
Посему вывод - либо как в Eiffel, конструкции с явно оформленными частями, либо как в Обероне - вообще без спец. вариаций (и для компактного языка общего назначения с упором на системное программирование это оптимальный выбор).
Построители же языков типа Шарпа могли бы последовать первому варианту, вслед за Eiffel - но увы, я больше чем уверен, что для них слово "инвариант" пустой звук, и язык они делали в первую очередь для таких же... А посему дальше FOREACH-BREAK у них фантазия не пошла. Ах, нет, иногда идёт - есть ещё Пёрл, с его секциями завершения циклов, на которые управление передаётся после break, или как-то там ещё... Це вообще вопиющий, показательный пример.
Добавить свое сообщение
Отслеживать это обсуждение 
Дополнительная навигация: |
|