Язык программирования Форт


Глава 11. Создание слов-определителей - часть 17


Оно может порождать другие слова, которые будут забирать из стека различное число параметров, компилировать их и потом использовать для инициализации начала игры LINELIFE. Каждое число, которое берет из стека MAKEDO, соответствует позиции, куда должна быть помещена клетка в массив IMAGE перед началом игры; это дает вам возможность связать описание любого количества исходных картин расположения клеток с именем. Такой подход представляет собой простую альтернативу созданию специального редактора для ввода картины начала эволюции : MAKEDO CREATE DEPTH DUP С, 0 DO С, LOOP DOES> CLEAR-IMAGE DUP C@ 1+ 1 DO DUP I + C@ * IMAGE + CHAR SWAP C! LOOP DROP ;

Слово MAKEDO заслуживает более внимательного рассмотрения: : MAKEDO (Имя слова-определителя) CREATE (Компилирует заголовок слова-ребенка) (Помещает в слово-ребенок адрес кода стадии исполнения) DEPTH (Помещает в стек значение его глубины) DUP С, (DUP и компилирует глубину стека) 0 DO (Начинает просмотр стека DEPTH раз...) , (Компилирует каждый элемент из стека) LOOP (пока они не кончатся) DOES> (Начинает определение стадии исполнения слова-ребенка) (Помещает в стек адрес содержимого слова-ребенка) CLEAR-IMAGE (Перед началом очищает массив IMAGE) DUP ( -- адр адр) С@ ( -- адр глубина) (Количество чисел в стеке) 1+ ( - адр глубина+1) 1 DO (Начинает цикл извлечения скомпилированных позиций в стек) DUP ( -- адр адр) I ( Индекс цикла, начинает извлечение с 1-й позиции) + ( -- адр адр+i) (Адрес байта) С@ ( Извлекает элемент i-й позиции из слова-ребенка) *IMAGE ( -- адр адр+i адр) ( Показывает первую клетку в IMAGE) + (Адрес, по которому клетка запоминается в IMAGE) CHAR ( -- адр адр_клетки сммв) ( симв - символ клетки) SWAP ( -- адр симв адр_клетки) С! ( Записывает клетку в массив IMAGE) LOOP ( - адр) ( Проходит по всем позициям) DROP ( -- ) ( После завершения удаляет ненужный адрес) ; (Конец определения) Определение слова MAKEDO позволяет скомпилировать произвольное число клеток в LINELIFE, не указывая в явном виде, сколько их есть.


- Начало -  - Назад -  - Вперед -