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