Здравствуйте, Пацак, Вы писали:
П>Здравствуйте, Сергей Губанов, Вы писали:
СГ>>Также и пишется: str1 := str2, равно как для любых массивов arr1 := arr2 (соответствующих типов — ведь массивы это самый обычный value-type, а значит можно так присваивать — нет исключений из правил).
П>должны сопровождаться некими дополнительными действиями (скажем, изменением состояния некоего третьего объекта). Что тогда? В C++ я переопределю оператор, в питоне — перекрою метод класса, а в Обероне?
Что, что — скопируете и сопроводите "некими дополнительными действиями". Прямо такой вопрос задаете, как буд-то ответ сами не знаете.
У бомжей берут интервью:
— "Скажите пожалуйста, вот вы живете на улице, а что вы делаете когда идет дождь?"
Бомжи недоуменно переглядываются, пожимают плечами и, в конце-концов, отвечают:
— "Как, что? Мокнем мы."
Здравствуйте, Сергей Губанов, Вы писали:
П>>должны сопровождаться некими дополнительными действиями (скажем, изменением состояния некоего третьего объекта). Что тогда? В C++ я переопределю оператор, в питоне — перекрою метод класса, а в Обероне? СГ>Что, что — скопируете и сопроводите "некими дополнительными действиями". Прямо такой вопрос задаете, как буд-то ответ сами не знаете.
Здравствуйте, Сергей Губанов, Вы писали:
СГ>Что, что — скопируете и сопроводите "некими дополнительными действиями". Прямо такой вопрос задаете, как буд-то ответ сами не знаете. СГ>
СГ>У бомжей берут интервью:
СГ> — "Скажите пожалуйста, вот вы живете на улице, а что вы делаете когда идет дождь?"
СГ>Бомжи недоуменно переглядываются, пожимают плечами и, в конце-концов, отвечают:
СГ> — "Как, что? Мокнем мы."
Вах, оберонисты сами себя уже бомжами считают...
Однако, неожиданно
Здравствуйте, Mamut, Вы писали:
M>ЗЫ. Только не надо перечислять, какие ошибки я допустил в Обероновском коде.
Ладно, я молча просто покажу как надо было:
PROCEDURE (this: QBitArray) Fill(v: BOOLEAN; size: INTEGER): BOOLEAN, NEW;
BEGIN
IF size >= 0 THEN
IF ~resize(size) THEN RETURN FALSE END
ELSE
size = this.size()
END;
IF size > 0 THEN
IF v THEN
memset(data(), 0FFH, (size + 7) DIV 8)
ELSE
memset(data(), 0, (size + 7) DIV 8)
END
END;
IF v THEN pad0 END;
RETURN TRUE
END Fill;
А, ну, тут прошу прощения, в принципе ни чем. Просто оборот речи. Смысл оборота — гиперболизация масштаба, дескать отличается не на чуть-чуть, а сильно.
Здравствуйте, Сергей Губанов, Вы писали:
СГ>А, ну, тут прошу прощения, в принципе ни чем. Просто оборот речи. Смысл оборота — гиперболизация масштаба, дескать отличается не на чуть-чуть, а сильно.
Сдаётся мне, что за всеми этими "гиперболизациями масштаба" (они же перфомансы) и проходит ваша профессиональная деятельность, а не за работой на реальными программными проектами.
M>>ЗЫ. Только не надо перечислять, какие ошибки я допустил в Обероновском коде.
СГ>Ладно, я молча просто покажу как надо было: СГ>
СГ>PROCEDURE (this: QBitArray) Fill(v: BOOLEAN; size: INTEGER): BOOLEAN, NEW;
СГ>BEGIN
СГ> IF size >= 0 THEN
СГ> IF ~resize(size) THEN RETURN FALSE END
СГ> ELSE
СГ> size = this.size()
СГ> END;
СГ> IF size > 0 THEN
СГ> IF v THEN
СГ> memset(data(), 0FFH, (size + 7) DIV 8)
СГ> ELSE
СГ> memset(data(), 0, (size + 7) DIV 8)
СГ> END
СГ> END;
СГ> IF v THEN pad0 END;
СГ> RETURN TRUE
СГ>END Fill;
СГ>
Это, как говорится, гррр
Как видим, реальный пример на Обероне ничем не лучше, а даже хуже аналогичного примера на С/С++ (из-за визуального шма и "крика"). Кстати, приведеный код не соответствует "стандартам" (на том же http://www.oberon.ethz.ch/ все строки заканчиваются точкой с запятой).
Ну что ж, it's the final countdown
PROCEDURE (this: QBitArray) Fill(v: BOOLEAN; size: INTEGER): BOOLEAN, NEW; bool QBitArray::fill( bool v, int size )
BEGIN {
IF size >= 0 THEN if ( size >= 0 ) {
IF ~resize(size) THEN RETURN FALSE END if ( !resize( size ) )
ELSE return FALSE;
size = this.size(); } else {
END; size = this->size();
IF size > 0 THEN }
IF v THEN if ( size > 0 )
memset(data(), 0FFH, (size + 7) DIV 8); memset( data(), v ? 0xff : 0, (size + 7) / 8 );
ELSE if ( v )
memset(data(), 0, (size + 7) DIV 8); pad0();
END; return TRUE;
END; }
IF v THEN pad0 END;
RETURN TRUE;
END Fill;
Итак, что имеем? Имеем "краткость — сестру таланта" Замечаем, что в некоторых местах даже по лексемам Оберон уступает С++ (я про самую первую строчку ). Да и конструкция IF THEN RETURN END; ELSE END; не является верхом совершенства ну никак. Кстати, вопрос — почему Паскалеподобные языки до сих пор так упорно цепляются за жесткое разделение FUNCTION/PROCEDURE, если разницы в них — практически ноль?
И еще вопрос, на засыпку — вопрос о непоследовательности языка. Почему делить — "DIV", а сложить — "+", а не "ADD"? Почему тогда ">", "<", "=" не "GTHAN", "LTHAN", "EQ"?
В общем, Оберон проиграл — это я невооруженным взглядом говорю И не в лексемах дело, а в ясности и отсутствии лишнего визуального шума.
Кстати, о визуальном шуме. Если бы научном сообществе некогда остались в силе "оберонцы", то до сих пор мы бы всю математику/физику учили бы в стиле:
SQRT 2 POW 2 EQ 2
... << RSDN@Home 1.1.4 beta 7 rev. 447>> ... <<Winamp is playing "Silence">> ...
П>>>должны сопровождаться некими дополнительными действиями (скажем, изменением состояния некоего третьего объекта). Что тогда? В C++ я переопределю оператор, в питоне — перекрою метод класса, а в Обероне? СГ>>Что, что — скопируете и сопроводите "некими дополнительными действиями". Прямо такой вопрос задаете, как буд-то ответ сами не знаете.
П>Не надо слов. Код пожалуйста.
Кода не будет. Единственный код в этой ветке пока представляю я Вот и сейчас придется отдуваться
Type-bound Procedures
The type-bound procedures are declared locally to the record scope. A type-bound procedure can override another type-bound procedure declared in any base type of the record, but it must have the same name and the same signature. (а вот здесь начинаются костыли — прим. мое) The call of an overridden procedure can only be done in a type-bound procedure by using an arrow after the procedure name.(что? какая такая стрелка????)
Более того, для собственных типов можно переопределять операторы: здесь (для OberonX):
OberonX allows the implementation of operators. An operator is defined as follows:
PROCEDURE "op" (a, b: T): Q;
BEGIN
.....
END "op";
The following operators can be defined:
dyadic operators: +, -, *, /, DIV, MOD
dyadic boolean operators: <, <=, >, >=, =, #, &, OR. The return type must be BOOLEAN
monadic operators: —
monadic boolean operators: ~. The return type must be BOOLEAN
assignment operator: :=. The first parameter must be a VAR parameter
PROCEDURE "+"* (a, b: ARRAY OF CHAR): ARRAY OF CHAR;
VAR res: ARRAY LEN(a) + LEN(b) + 1 OF CHAR; i, j: LONGINT;
BEGIN
i := 0;
WHILE a[i] # 0X DO res[i] := a[i]; INC(i) END;
j := 0;
WHILE b[j] # 0X DO resij] := b[j]; INC(i); INC(j) END;
res[i] := 0X;
RETURN res
END "+";
Блин! Этих Оберонов — как собак нерезанных. И каждый обладает своим собственным набором костылей. Тьфу.
... << RSDN@Home 1.1.4 beta 7 rev. 447>> ... <<Winamp is playing "Silence">> ...
Здравствуйте, Сергей Губанов, Вы писали:
СГ>1) Известно, что Си-образный синтаксис использует больше лексем чем это реально необходимо. СГ>2) Известно, что стандарты оформления Си-образного кода требуют использования большего количества строчек чем это реально необходимо (чтобы читающему понятно стало где что написано).
А как на счет препроцессора?
СГ> Инструкция выполнения по условию СГ>a — условие СГ>x — выполняемое действие СГ>
СГ>IF a THEN x END
СГ>
#define IF if(
#define THEN ){
#define END ;}
СГ> Инструкция выполнения по условию с альтернативой СГ>a — условие СГ>x, y — выполняемые действия СГ>
СГ>IF a THEN x ELSE y END
СГ>
#define ELSE ;} else {
СГ> Сложная инструкция выполнения по условию СГ>a, b — условия СГ>x, y, z — выполняемые действия СГ>
СГ>IF a THEN x ELSIF b THEN y ELSE z END
СГ>
#define ELSIF ;} else if(
СГ> Цикл с проверкой условия в начале итерации СГ>a — условие выполнения итерации СГ>x — выполняемое действие СГ>... СГ>
СГ>WHILE a DO x END
СГ>
#define WHILE while(
#define DO ){
END — как выше.
СГ> Цикл с проверкой условия в середине итерации СГ>a — условие завершения СГ>x, y, z — выполняемые действия СГ>
СГ>LOOP
СГ> x;
СГ> IF a THEN y; EXIT END;
СГ> z
СГ>END
#define LOOP for(;;){
#define EXIT break
СГ>[*] Цикл с проверкой условия в конце итерации
СГ>a - условие продолжения
СГ>b - условие завершения
СГ>x - выполняемое действие
СГ>Реально необходимый и достаточный синтаксис:
СГ>[code]
СГ>REPEAT x UNTIL b
СГ>
Вот это напрямую сделать не получится, но если допустить REPEAT x UNTIL(b);
#define REPEAT do{
#define UNTIL }while
СГ> Инструкция выбора варианта выполнения СГ>n, a, b — параметры для определения варианта СГ>x, y, z — выполняемые действия СГ>Си-образный синтаксис: СГ>
СГ>Реально необходимый и достаточный синтаксис: СГ>
СГ>CASE n OF a: x | b: y ELSE z END
СГ>
Кстати, опущена возможнсть вот такого:
switch(n)
{
case a:
x();
case b:
y();
break;
default:
z();
}
— если a, то выполним и x() и y(). Ну это так, к слову
К сожаленю, препроцессор не позволяет переопределить |, да и ELSE уже определено. С чуть другим синтаксисом можно так:
#define CASE switch(
#define OF ){ case
#define OR_CASE ;break; case
#define ELSE_CASE ;break; default:
Здравствуйте, Сергей Губанов, Вы писали:
СГ>Здравствуйте, ForestLabs, Вы писали:
FL>>Гы. Был такой язык российского разлива — Ямб. FL>>Дык в нем циклы писались так: FL>>(что-то в цикле)3 FL>>Т.е. в примере выполнить цикл 3 раза. Ну лаконичнее некуда.
СГ>Согласен. СГ>Вопрос лишь, а что в нем было еще кроме циклов, ведь на все дела разных типов скобок не напасешься, не так ли?
Если честно — не помню. Было это в 1987-8 годах. Циклы только запомнились.
А так — нормальный процедурный язык. Автор, если не ошибаюсь — Ярошевская.
Работал на машинах "Искра".
Здравствуйте, Сергей Губанов, Вы писали:
СГ>1) Известно, что Си-образный синтаксис использует больше лексем чем это реально необходимо. СГ> [skipped]
По-моему, пора уже сказать для чего была затеяна дискуссия. Провокация удалась на славу. Кто не верит, что это провокация, читайте ответы автора — он же не внимает абсолютно никаким доводам — один против всех . Это однозначно удавшаяся шутка.
Здравствуйте, Сергей Губанов, Вы писали:
СГ>IF ... THEN ... END СГ>IF ... THEN ... ELSE ... END СГ>IF ... THEN ... ELSIF ... ELSE ... END СГ>CASE ... OF ... : ... | ... : ... | (и т.д.) ELSE ... END СГ>WITH ... : ... DO ... |... : ... DO ... | (и т.д.) ELSE ... END СГ>WHILE ... DO ... END СГ>LOOP ... END СГ>REPEAT ... UNTIL ...
В привидённом примере, также есть лишние токены. Его можно минимизировать хотя бы так:
... THEN ... END
... THEN ... ELSE ... END
... THEN ... ELSIF ... ELSE ... END
... OF ... : ... | ... : ... | (и т.д.) ELSE ... END
WITH ... : ... DO ... |... : ... DO ... | (и т.д.) ELSE ... END
... DO ... END
LOOP ... END
REPEAT ... UNTIL ...
Теперь все условия начинаются с выражения, за которым следует THEN. Аналогичным образом избавляемся от CASE и WHILE. Так же можно убрать и WITH.
Здравствуйте, Sergey, Вы писали:
СГ>> Цикл с проверкой условия в начале итерации СГ>> a — условие выполнения итерации СГ>> x — выполняемое действие СГ>> Си-образный синтаксис:
СГ>> while(a)
СГ>> {
СГ>> x();
СГ>> }
S>Никто так не пишет Пишут S>while(a) x();
/*...пропускаем...*/ S> if (a) x();
Не раз приходилось совершать\видеть ошибки из-за того, что добавляя в цикл\условие ещё одно выражение, автор "забывал" по торопливости добавлять скобки.
// Былоif(a)
x();
//Становилосьif(a)
x();
y();
Когда это всё окружено ещё каким-то кодом, с различными ветвлениями, с первого раза и не обратишь внимание.
В моём же варианте в случае изменения "внутренностей" цикла\условия обёртка (здесь из while или if) подвергается минимальным изменениям:
while(a) {
x();
}//whileif(a) {
x();
}//if
Ну и строк пустых нету Это я всё к тому, что "Никто так не пишет".
СГ>> Цикл с проверкой условия в середине итерации СГ>> a — условие завершения СГ>> x, y, z — выполняемые действия СГ>> Си-образный синтаксис: СГ>>
S>Если yt нравится многословность, будем сокращать. Только чур не обижацца на S>читаемость
S>for (; x(), a; z());
S>y();
under «*none*»,
... << RSDN@Home 1.1.4 beta 7 rev. 467>>
Help will always be given at Hogwarts to those who ask for it.
Re[2]: Синтаксический оверхед
От:
Аноним
Дата:
12.06.05 20:56
Оценка:
Здравствуйте, Airat Burganov, Вы писали:
AB>Здравствуйте, Сергей Губанов, Вы писали:
СГ>>1) Известно, что Си-образный синтаксис использует больше лексем чем это реально необходимо. СГ>> [skipped]
AB>По-моему, пора уже сказать для чего была затеяна дискуссия. Провокация удалась на славу. Кто не верит, что это провокация, читайте ответы автора — он же не внимает абсолютно никаким доводам — один против всех . Это однозначно удавшаяся шутка.
Да не...
Это не провокация.
Он тут на форуме известен своей любовью к оберонам.
Просто последние несколько месяцев он хранил молчание.
Видимо готовил новый удар, занимаясь исследованием синтаксического оверхеда
Здравствуйте, Аноним, Вы писали:
А>Здравствуйте, Airat Burganov, Вы писали:
AB>>Здравствуйте, Сергей Губанов, Вы писали:
СГ>>>1) Известно, что Си-образный синтаксис использует больше лексем чем это реально необходимо. СГ>>> [skipped]
AB>>По-моему, пора уже сказать для чего была затеяна дискуссия. Провокация удалась на славу. Кто не верит, что это провокация, читайте ответы автора — он же не внимает абсолютно никаким доводам — один против всех . Это однозначно удавшаяся шутка.
А>Да не... А>Это не провокация. А>Он тут на форуме известен своей любовью к оберонам. А>Просто последние несколько месяцев он хранил молчание. А>Видимо готовил новый удар, занимаясь исследованием синтаксического оверхеда
А добился одного только — еще несколько человек стали иначе относиться к Оберону.
Вместо нейтрального "не знаю что за язык такой Оберон" стало негативное "оберон- полное г...о"
Re[4]: Синтаксический оверхед
От:
Аноним
Дата:
13.06.05 12:15
Оценка:
Здравствуйте, moudrick, Вы писали:
M>А добился одного только — еще несколько человек стали иначе относиться к Оберону. M>Вместо нейтрального "не знаю что за язык такой Оберон" стало негативное "оберон- полное г...о"
А это всегда так бывает, когда человек считает своим долгом
открыть народу глаза и привести их истинной правде и счатью.