Andrey Slepuhin (pooh@msu.ru)
Thu, 09 Dec 1999 14:32:05 +0300
Arkady Klimov wrote:
>
> Было бы неплохо кое-где слегка прокомментировать.
> Я попытаюсь это сделать. И вопросы задать.
>
> ----- Original Message -----
> From: Andrey Slepuhin <pooh@msu.ru>
> To: <refal-plus@botik.ru>
> Sent: Wednesday, December 08, 1999 7:20 PM
> Subject: About new Refal+ release
>
> > День добрый всем!
> >
> > Я закончил работу над очередной версией Рефала+. То есть
> > дистрибутив под Linux можно выложить в любое время. Однако
> > я хочу задержать выкладывание дистрибутива до тех пор, пока
> > Сергей (Битюков) не проверит, что под Windows все работает
> > нормально. Заодно я хочу сделать анонс того, что я добавил,
> > чтобы было время все осмыслить и высказать замечания (если
> > таковые имеются).
> >
> > 1) Case-sensitivity.
> > Новая версия Рефала+ по умолчанию является case-sensitive.
> > Старые программы можно компилировать с ключиком -u (поднять
> > имена в верхний регистр). Для новых программ есть два варианта
> > работы со стандартными модулями:
> > а) Имена стандартных модулей и имена функций записываются
> > большими буквами;
> > б) Имена стандартных модулей и имена функций записываются
> > в mixed-case в соответствии с тем, как было описано в
> > одном из моих предыдущих писем.
> > Никаких опций компилятору задавать не требуется - имена
> > распознаются автоматически. При этом нельзя, скажем, писать
> > имена модулей большими буквами, а имена функций в mixed-case.
> Не слишком ли умный становиться компилятор? Боюсь это еще нам боком выйдет.
Думаю, что нет. Все равно базовую библиотеку переписывать надо.
> >
> > 2) Генерация виртуального кода.
> > Новая версия Рефала+ может генерировать виртуальный код. Для
> > этого нужно указать опцию -vc. Сгенерированный виртуальный код
> > будет выведен в файл с расширением .rvc (Refal Virtual Code) в
> > виде объектного выражения, которое может затем быть считано
> > одним вызовом функции Read. Виртуальный код соответствует описанию
> > в статье "Принципы реализации Рефала+") со следующими расширениями:
> > а) Новые команды LEIS/LVIS/LES,REIS/RVIS/RES - семантика
> > следующая (на примере LEIS/LVIS/LES):
> > < LEIS m : LES : C, S, D, E > =>
> > { S/m = Oe и Oe : S =S' } < C, S', (LES : C, S') : D, E>
> > < LVIS m : LES : C, S, D, E > =>
> > { S/m = Oe } < LES : C, Oe : S, D, E>
> > < LES : C, OtOe' : S, D, E > => { Oe' : S = S' } < C, S', (LES :
> > C : S') D, E>
> > < LES : C, p : S, D, E > => < FAIL : [], S, D, E>
> - это оптимизированные команды удлинения. Используются в случае, когда
> просмотренная часть (e1 в образце e1 sA e2) далее в теле функции не
> используется.
> (Если конечно, я это правильно понял. Андрей, поправь меня, если это не
> так).
Абсолютно точно. На самом деле я бы кое-что поменял в командах
отщепления - уж больно они запутанные, и мне совсем не нравится
требование, чтобы LEI/LE всегда были рядом. На самом деле все
можно сделать более прозрачно с явными ALT'ами, и обойтись вообще
без команд типа LEI. Если что - я могу подробно описать то, как я
все это вижу.
>
> > б) Новые команды:
> > PUSHEMP == PUSHQ []
> - положить пустое выражение на стек
>
> > PUSHBR m == PUSH m; BR
> - вытащить m-й эл-т стека, взяв его в скобки
>
> > MOVE -
< MOVE m n : C, Oe_0 : ... : Oe_n : S, D, E > =>
< C, Oe_0 : ... : S/Oe_m : S, D, E >
> - на место n-го эл-та стека поставить (n+1+m)-й (Странный номер! наверно,
> не S/m, а ... ?)
Ой, ну да конечно... S ведь у нас это не стек целиком...
Естественно, имелся в виду m-й элемент.
Т.е. MOVE m n просто кладет m-й элемент стека на место n-го.
>
> > MOVEQ -
> > < MOVEQ n Oe : C, Oe_0 : ... : Oe_n : S, D, E > =>
> > < C, Oe_0 : ... : Oe : S, D, E >
> - поместить данное объектное выражение в стек в n-ю позицию (взамен старого
> n-го эл-та)
>
> > MOVEEMP == MOVEQ []
> - непонятно ( не хватает числа n )
Извиняюсь, очепятка :-)
MOVEEMP n == MOVEQ n []
>
> > SWAP -
> > < SWAP m n : C, Oe_0 : ... : Oe_m : ... : Oe_n : S, D, E > =>
> > < C, Oe_0 : ... : S/n : ... : S/m : S, D, E >
> - совсем непонятно. (Вообще-то, когда пишешь для людей, лучше использовать
> русский язык).
Просто поменять m-й и n-й элементы местами.
> И обязательно ли, что m<n?
Нет конечно. Я просто не знаю, как это правильно записать формально.
> >
> > FUNFAIL Fname == PUSHQ Fname "Unexpected fail"; ERROR
> > FUNEND == NOP , но всегда в конце функции.
> >
> > в) Директивы:
> > IMPORT/EXPORT/LOCAL FUNC/BOX/TABLE/VECTOR/STRING/CHANNEL -
> > семантика очевидна.
> А какой синтаксис? (Речь идет ведь не о рефале, а о виртуальном коде, да?)
> Какая семантика LOCAL FUNC (в отличие от FUNC)? Это два слова?
Просто FUNC нету. Т.е. синтаксис директивы _всегда_ содержит два
слова - linkage class (не знаю, как это сказать по русски) и тип
объекта.
Это как раз спорное место, которое я хотел обсудить. Не стоит ли разбить
каждую директиву на две?
> >
> > 3) Функции ввода-вывода теперь правильно работают с символами-ссылками
> Есть ли возможность управлять таблицей соответствий имя-ссылка (задать ее
> начальное содержимое, например)? Получить ее конечное содержимое? Является
> ли композиция ввод;вывод тождественной операцией. (Хотя бы на тех файлах,
> которые сами получены выводом).
>
> >
> > 4) Подключен "дырявый" рефал и исправлены в нем ошибки. "Дырявость"
> > контролируется переменной среды RFP_HOLECTRL, значение которой
> > имеет вид
> > RFP_HOLECTRL=l;r;s
> > где l - процент дырок слева, r - процент дырок справа, s -
> > минимальная длина результирующего выражения, для которой дырки
> > разрешены. По умолчанию Рефал+ работает в "не дырявом" режиме.
> "Процент дырки" - доля в процентах, которую составляет размер дырки от
> размера самого выражения (?).
Да. Процент от размера результата конкатенации.
>
> >
> > 5) Теперь любую откомпилированную рефал-программу можно запускать
> > со следующими опциями:
> > -rfp-heapsize <n> - задает размер heap'а в байтах
> > -rfp-stacksize <n> - задает размер стека в байтах
> > -rfp-lholes <n> \
> > -rfp-rholes <n> | - задают "дырявость"
> > -rfp-minholes <n> /
> > -rfp-memstat - разрешают печать статистики использования
> > памяти после окончания программы.
> >
> > 6) Разрешены комментарии, начинающиеся на //
> >
> > Всего доброго,
> > Андрей.
> >
> >
> Спасибо,
> Аркадий.
This archive was generated by hypermail 2.0b3 on Thu Dec 09 1999 - 14:32:38 MSK