Описание библиотеки STRUCT+METHODS.F для Nova-forth

Jan 16, 2019 22:11

Расширение структур возможностью автосоздания дополнительных операций над элементами. Условно выражаясь, это методы доступа к элементам структуры.

На данный момент определены следующие методы:
  • @ получить значение из элемента;
  • ! присвоить значение элементу;
  • I увеличить значение элемента на 1;
  • D уменьшить значение элемента на 1;
  • +! добавить число к значению элемента и сохранить;
  • zero обнулить значение элемента;
  • E выполнить код, хранящийся в элементе.
Не для каждого элемента будет скомпилирован тот или иной метод. Поскольку для некоторых элементов методы не определены, или не могут существовать вообще.
К примеру, если размер элемента не равен CELL ,то метод E будет проигнорирован.

Обозначение методов это обычные константы у которых установен соответсвующий бит. Все константы перечислены в словаре flags. Но чтобы не лазить каждый раз в этот словарь данная библиотека имеет свой NOTFOUND.
Поэтому для задания методов можно перечислить обозначающие их флаги через / (обратную косую черту). Эти флаги будут объединены в одно число операцией OR.
Пример синтаксиса: !/@/E

Библиотека предоставляет слова для определения своих методов (см. слово CREATE-M). Но у методов есть ограничение, методы должны быть примитивами, поскольку они все метятся флагом INLINE . Данное ограничение было сделано для возможности определения методов во временных словарях ради последующего сокрытия деталей и экономии памяти.

Чтобы создать элемент структуры вместе методами доступа к нему используйте слово --m
Это слово работает как и -- , но дополнительно принимает битовый перечень методов в качестве первого параметра.

Пример кода:

STRUCT: weapon
CELL !/@ --m NAME
1 !/@ --m NAME-LEN
2 !/@ --m AMMO-CODE
CELL !/@/E --m FIRE-FUN
CELL !/@/zero/I/D --m AMMO
STRUCT;

Вместе со смещениями будут скомпилированы:
NAME! NAME@ AMMO++ AMMO-- FIRE-FUN-EXEC FIRE-FUN! FIRE-FUN@ и проч.

После загрузки библиотеки необходимо добавить в контекст словарь STRUCT&METHODS
Previous post Next post
Up