Re: About new Refal+ release


Andrey Slepuhin (pooh@msu.ru)
Thu, 09 Dec 1999 16:21:20 +0300


Arkady Klimov wrote:

[snip]

> > > > а) Новые команды 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. Если что - я могу подробно описать то, как я
> > все это вижу.
> Да, это интересно. Если получается, это будет, наверно, лучше. Напиши,
> пожалуйста.

LE предлагается изменить следующим образом (я обзову эту команду LX,
чтобы
не было путаницы):
  < LX : C, OtOe" : Oe' : S, D, E > => < C, Oe" : Oe'Ot : S, D, E >
  < LX : C, p : Oe : S, D, E > => < FAIL : [], S, D, E >

Тогда пара команд LEI m : LE заменяется на
  PUSHEMP
  PUSH m+1
  JUMP L2
  LABEL L1
  LX
  LABEL L2
  ALT L1
  ...

A LVI m : LE заменяется на
  PUSHEMP
  PUSH m+1
  LABEL L1
  LX
  ALT L1
  ...

Аналогично поступаем с LEIS/LES и с отщеплениями справа.
Кстати сказать, в реальной жизни так отщепления в ассемблер и
компилируются.

[snip]

> > > > в) Директивы:
> > > > IMPORT/EXPORT/LOCAL FUNC/BOX/TABLE/VECTOR/STRING/CHANNEL -
> > > > семантика очевидна.
> > > А какой синтаксис? (Речь идет ведь не о рефале, а о виртуальном коде,
> да?)
> > > Какая семантика LOCAL FUNC (в отличие от FUNC)? Это два слова?
> >
> > Просто FUNC нету. Т.е. синтаксис директивы _всегда_ содержит два
> > слова - linkage class (не знаю, как это сказать по русски) и тип
> > объекта.
> > Это как раз спорное место, которое я хотел обсудить. Не стоит ли разбить
> > каждую директиву на две?
> Ох, я совсем ничего не понял, можно поподробнее?

Я сделал так - возьмем для примера функцию, для нее возможны
три директивы:
   IMPORT FUNC <fname> - функция определена где-то в другом модуле
   EXPORT FUNC <fname> - функция определена в нашем модуле и является
глобальной
   LOCAL FUNC <fname> - функция определена в нашем модуле и является
локальной

То же самое для других объектов, для них, кроме того, объявления EXPORT
и
LOCAL являются сразу и определениями.
Другой возможный вариант - разнести это по разным директивам. Тогда
мы будем писать, скажем
  BOX <name>
  EXPORT <name>

Почему я объединил определение объекта и его linkage вместе?
Потому что тогда очень легко по одной директиве сразу построить
необходимое объявление при компиляции, скажем в С, да и виртуальный код
меньше загромождается. Например:
  IMPORT BOX Box =>
     extern rf_box_t Box;
  EXPORT BOX Box =>
     rf_box_t Box;
  LOCAL BOX Box =>
     static rf_box_t Box;

Однако, здесь могут быть другие мнения, и я с радостью их
выслушаю.

Всего доброго,
Андрей.



This archive was generated by hypermail 2.0b3 on Thu Dec 09 1999 - 16:22:12 MSK