Учебное пособие по языку ФОРТ
- Автор: ИТФ «Технофорт»
- Жанр: Современные российские издания / Литература ХX века (эпоха Социальных революций) / Программирование: прочее / Forth
- Дата выхода: 1993
Читать книгу "Учебное пособие по языку ФОРТ"
17. Слова-генераторы
В отличие от других языков Форт позволяет программисту создавать собственные определяющие слова. Это дает возможность создавать семейства слов с похожими свойствами. Одинаковые признаки задаются не в каждом члене, а в самом определяющем слове. Благодаря этому сокращается текст программ, они легче читаются и модифицируются. При умелом использовании таких конструкций эффект может быть очень значительным. Определяющие слова будем также называть словами-генераторами или мета-определяющими словами. С помощью собственных генераторов можно образовывать новые структуры данных, например, многомерные массивы.
Слова-генераторы описываются с помощью слов "CREATE" и "DOES>" в конструкции
: имя-генератора CREATE <часть-create>
DOES> <часть-does> ;
и употребляются в конструкции
имя-генератора имя (*)
для определения слова "имя".
Слово "CREATE" в определении генератора указывает начало действий, выполняемых в период компиляции будущего определяемого слова; слово "DOES>" — начало действий во время исполнения этого нового слова.
При выполнении конструкции (*) слово "CREATE" создает в кодофайле словарную статью для слова "имя", но при этом память под поле параметров не выделяется. После этого исполняется текст <часть-create>, который может создать поле параметров определяемого слова. B дальнейшем при исполнении слова "имя" на стек кладется адрес его поля параметров и выполняется текст <часть-does>.
Например, генератор для определения констант выглядит так:
: CONSTANT CREATE , ( слово "," резервирует 2 байта )
( и кладет в них число из стека )
DOES> ( на стеке адрес этих двух байтов )
@ ; ( значение помещается в стек )
B качестве упражнения разберите устройство генератора одномерных массивов. Слово "ARRAY" берет из стека целое число n и резервирует в кодофайле место для n чисел, связывая с ними следующее за "ARRAY" слово как имя этого массива. В дальнейшем при выполнении имени массива из стека берется индекс, проверяется его принадлежность диапазону от 1 до n и, если все в порядке, в стек помещается адрес соответствующего элемента массива.
: ARRAY ( в стеке лежит число элементов )
CREATE DUP , ( это число помещается в поле параметров )
2* ALLOT ( захват места для массива )
DOES> ( при вызове в стеке лежит индекс )
( и помещается адрес захваченной памяти )
OVER 1 <
IF ." ИНДЕКС МЕНЬШЕ 1" 2DROP
ELSE 2DUP @ > IF ." ИНДЕКС БОЛЬШЕ ЧЕМ НАДО" 2DROP
ELSE 1+ SWAP 2* + THEN THEN ;