Оберон-клуб «ВЄДАsoft»
https://zx.oberon.org/forum/

Новый компилятор Oberon-07/11 для x86 Windows/Linux от akron1
https://zx.oberon.org/forum/viewtopic.php?f=40&t=75
Страница 2 из 2

Автор:  geniepro [ 19 фев 2018, 20:41 ]
Заголовок сообщения:  Re: Новый компилятор Oberon-07/11 для x86 Windows/Linux от akron1

akron1 писал(а):
За прошедшее время, накопилось много мелких изменений: сделано удаление неиспользуемых процедур, добавлены некоторые расширения языка, исправлены ошибки, усовершенствована библиотека для KolibriOS.

akron1, у тебя процедуры работы с множествами INCL и EXCL требуют вторым параметром константу? Но ведь в 16 страницах не сказано, что там может быть лишь константа, там сказано -- аргумент x имеет тип INTEGER:
Цитата:
INCL(v, x) v: SET; x: INTEGER v := v + {x}
EXCL(v, x) v: SET; x: INTEGER v := v - {x}

так же как тут, например:
Цитата:
FLT(x) INTEGER REAL identity

А вот, например, указано именно ConstExpression:
Цитата:
ForStatement =
FOR ident ":=" expression TO expression [BY ConstExpression] DO
StatementSequence END .


ЗЫ. Кстати, в чём смысл ограничивать шаг цикла FOR константой???

Автор:  akron1 [ 19 фев 2018, 22:32 ]
Заголовок сообщения:  Re: Новый компилятор Oberon-07/11 для x86 Windows/Linux от akron1

В репорте от 22.09.2011 написано:
Цитата:
Procedures INC and DEC may have an explicit increment or decrement. It must be a constant. Also
for INCL and EXCL, x must be a constant.


В более поздних редакциях, Вирт отказался от этого ограничения.

FOR вообще не очень нужен. Если требуется переменный шаг -- надо использовать WHILE. Для случая постоянного шага, FOR теоретически может помочь простому компилятору сгенерить более эффективный код, чем для цикла WHILE, потому что FOR более формализован: инкремент указан в самом операторе цикла, а не прописывается в отдельном операторе присваивания.

Кстати, я что-то не помню случая, когда мне потребовался бы переменный шаг.

Еще вот семантика цикла FOR в разных репортах различается:
2011:
Цитата:
The for statement
FOR v := beg TO end BY inc DO S END
is, if inc > 0, equivalent to

v := beg; lim := end;
WHILE v <= lim DO S; v := v + inc END

and if inc < 0 it is equivalent to

v := beg; lim := end;
WHILE v >= lim DO S; v := v + inc END

2016:
Цитата:
The for statement
FOR v := beg TO end BY inc DO S END
is, if inc > 0, equivalent to

v := beg;
WHILE v <= end DO S; v := v + inc END

and if inc < 0 it is equivalent to

v := beg;
WHILE v >= end DO S; v := v + inc END


Во втором случае end вычисляется в каждой итерации... и мне это не нравится.

Автор:  trurl [ 20 фев 2018, 08:38 ]
Заголовок сообщения:  Re: Новый компилятор Oberon-07/11 для x86 Windows/Linux от akron1

geniepro писал(а):
ЗЫ. Кстати, в чём смысл ограничивать шаг цикла FOR константой???

По крайней мере знак шага надо знать при компиляции. Иначе получится страшный код.

Страница 2 из 2 Часовой пояс: UTC + 2 часа
Powered by phpBB® Forum Software © phpBB Group
https://www.phpbb.com/