Здравствуйте, Mamut, Вы писали:
M>Здравствуйте, Mamut, Вы писали:
СГ>>>Если в будущем, например, IBM или Intel соберется изобрести новый язык, то почему-бы им не взять в качестве синтаксической основы правильный синтаксис Modula/Oberon? Их язык от этого только выиграет.
M>>Кто сказал, что этот синтаксис — правильный? Только не надо ссылки на самого себе приводить. Требуется ссылка на строгое математическое доказательство правильности данного синтаксиса.
M>Как всегда, все приходится делать самому. Не знаю, увидят ли это сообщение в этой ветке, ну да ладно.
M>Syntax across languages
M>Некоторые варианты синтаксиса просто великолепны.
Thax, Mamut!
Интересная ссылочка, только вот из виртовских детищ только паскаль, ну, видимо, не интересно людям что там в оберонах всех этих творится...
Здравствуйте, Amidlokos, Вы писали:
A> Однако имеет смысл только для одной проверки. Ну двух. А если точек выхода десяток (по найденному, по обнаруженному битому, срочно по переключению мютекса и т.п.)?
Так Вы определитесь, что конкретно нужно. Приведите конкретный пример. Чтобы потом без всяких там, а вот если бы да кабы, то в носу бы выросли грибы...
Здравствуйте, Сергей Губанов, Вы писали:
СГ>Здравствуйте, Mamut, Вы писали:
M>>Любой цикл и условие в программе можно переписать с использованием только цикла while.
СГ>а его, в свою очередь, через LOOP:
а его, в свою очередь, через GOTO.
Но, видимо, чтоб неповадно было, из Оберона его убрали.
Здравствуйте, Сергей Губанов, Вы писали:
СГ>Если исполнить эту просьбу, то надо кратко ответить — "У Вас ошибки". Но Вы же наверняка потом спросите, а где именно у меня ошибки? Ведь так, да? Ладно, вместо того чтобы придираться, я сразу напишу по грамотному.
СГ>
СГ>LOOP
(скип)
СГ>END
СГ>
Просто замечательно. То есть любой while-цикл, который требует прерывания по break в обероне автоматически превращается в LOOP.
Есть цикл некий цикл:
Прога, содержащая его давно и нормально работает. Но в один прекрасный момент заказчик-юзер заявляет, что согласно новому протоколу чтение может быть прервано не только при end_of_stream(), но и при некотором сигнальном значении is_terminate_signal(boo). В итоге на С++ код (в общем случае) превращается в
while (! end_of_stream()) {
...
boo = process(foo);
if (is_terminate_signal(boo)) break;
....
}
что означает добавление одной (!) строчки. В обероне программист должен переделать WHILE на LOOP с двумя IF .. THEN EXIT END по одному на каждое условие. Безумно удобно, ничего не скажешь!
ИМХО единственное, чего можно добиться таким подходом — так это того, что программисты будут все циклы, кроме самых тривиальных писать через ж... ой то есть через LOOP. Попросту чтоб потом не заморачиваться с возможными переделками.
Здравствуйте, Сергей Губанов, Вы писали:
СГ>Здравствуйте, alexku, Вы писали:
A>>То есть, забыл скобки — получил глюк.
СГ>А что Вы можете предложить в замен?
СГ>TYPE Func: PROCEDURE(): Func;
СГ>VAR a: Func;
СГ>a — обозначает саму себя как процедурную переменную СГ>a() — обозначает результат, который вернула процедура-функция после исполнения
СГ>Как иначе-то, может быть?
Это к вопросу о невозможности допустить ошибку в Обероне, если не понятно.
СГ>>Объяснение этому феномену на самом деле тривиальное...
SJA>Да-да. Совершенно тривиальное. Авторы отчаялись его кому-нибудь впарить, и открыли коды. Думали наверное кого-то завлечь беплатным сыром...
Да не бесплатности объяснение, а объяснение почему сборщик мусора в BlackBox работает в несколько раз быстрее чем сборщик мусора в .NET.
СГ>Уверяю Вас это было видно сразу же по тексту программы. Ведь активация процедуры-функции всегда помечается скобками () даже если список параметров пуст.
Это сыграло мое неполное знание синтаксиса языка. В общем, такое же, как и у вас, когда вы сетовали на оператор "-->" в C++
Здравствуйте, Mamut, Вы писали:
К>>Интересная ссылочка, только вот из виртовских детищ только паскаль, ну, видимо, не интересно людям что там в оберонах всех этих творится...
M>Там еще Modula-3 мелькает иногда
А она ещё Виртовская? Я уже в этих клонах запутался, если честно, кто там что и куда — хрен разберёшь, зато синтаксис офигенный
П>что означает добавление одной (!) строчки. В обероне программист должен переделать WHILE на LOOP с двумя IF .. THEN EXIT END по одному на каждое условие. Безумно удобно, ничего не скажешь! П>ИМХО единственное, чего можно добиться таким подходом — так это того, что программисты будут все циклы, кроме самых тривиальных писать через ж... ой то есть через LOOP. Попросту чтоб потом не заморачиваться с возможными переделками.
Здравствуйте, Сергей Губанов, Вы писали:
СГ>Речь шла не о служебном слове BEGIN, а о самостоятельном блоке BEGIN ... END, которого в Обероне нет.
И чем же пара BEGIN ... END в объявлении процедуры менее самостоятельна, чем в цикле или условном операторе? Тем, что Вирт не догадался написать что-нибудь типа PROCEDURE .... BEGPROC ... END? Или наоборот IF condition BEGIN END?
Здравствуйте, Сергей Губанов, Вы писали:
СГ>Кстати, можно усовершенствовать: СГ>LOOP a[i] := b[j]; СГ> IF b[j] # 0X THEN INC(i); INC(j) ELSE EXIT END СГ>END СГ>так короче.
Угу. А вот так — еще короче:
LOOP a[i] := b[j]; IF b[j] # 0X THEN INC(i); INC(j) ELSE EXIT END END
Но вот только до исходного
while (*dest++ = *src++) continue;
по краткости все равно не дотягивает, хоть убейся.
Здравствуйте, alexku, Вы писали:
A>В этом вашем примере assert(n <= -1) совершенно не имеет смысла, потому что значение n предсказуемо на 100% и всегда будет равно -1.
Это было бы так если бы использовался Modula/Oberon в которых из цикла WHILE нельзя выйти ни каким другим способом. В С# же был выход по break. Поэтому значение n на реальных данных всегда было больше нуля, а не то что больше -1. Ошибку я нашел просто случайно поглядев на исходник, а вовсе не от того что программа упала (она не падала) и я залезши в дебагер стал там чего-то крутить.
Q>> какова его практическая польза
СГ>Его можно использовать для математического доказательства правильности алгоритмов. Об этом говорилось в самом начале (верификация).
Можно использовать... А если из цикла несколько выходов — то нельзя? Ну так это проблема ваших методов верификации и это не означает, что так нельзя писать программы или что они от этого станут хуже.
Мне это напомнило случай советских времен, когда какое-то НИИ разработало систему для автоматичекой пайки печатных плат. Правда у нее был маленький недостаток (как и у ваших методов верификации): она могла собирать плату только если на ней стояли все одинаковые элементы. В результате министерство издало приказ: электронная аппаратура должна разрабатываться так, чтобы могла собираться этой системой, то есть на одной плате должны быть только резисторы, на другой — только конденсаторы, на третьей микросхемы одного размера, на четвертой — другого и т.д. И все они должны вставляться в кросс-плату с одинаковыми разъемами.
Я отвечаю за свои слова, а не за то как вы их интерпретируете!
СГ>Если в будущем, например, IBM или Intel соберется изобрести новый язык, то почему-бы им не взять в качестве синтаксической основы правильный синтаксис Modula/Oberon? Их язык от этого только выиграет.
А что от этого выиграют IBM и Intel? Похвалу Сергея Губанова?
S>LOOP
S> a[i] := b[j];
S> IF b[j] = 0X THEN EXIT END;
S> INC(i);
S> INC(j)
S>END
S>
Можно еще короче:
LOOP a[i] := b[j];
IF b[j] # 0X THEN INC(i); INC(j) ELSE EXIT END
END
А инструкции с побочным эффектом опасны. Кроме того, код while (*a++ = *b++); вообще писать нельзя так как он не проверяет выход за границы и может привести к такой любомой сишной ошибке как переполнение буфера.
Надо писать хотя бы так:
LOOP
IF (i < LEN(a)) & (j < LEN(b)) THEN
a[i] := b[j];
IF b[j] # 0X THEN INC(i); INC(j) ELSE EXIT END
ELSE EXIT END
END
С другой стороны, массивы в Pascal/Modula/Oberon это есть обычные типы значения, так что для полного копирования одного массива в другой можно просто написать a := b. Что касается строк, то для работы с ними есть уже встроенные механизмы.