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


Глава 10. Хранение программ и данных - часть 30


После этого мы предлагаем вам дополнить список слов еще некоторыми функциями в упражнениях. выглядеть, если запросить листинг первого блока: 1 John Slmpson^2223 Second St.^Louisville, PA 234^56-225-294-678^ 2 Jean Baptist de Lamarc^23a Rue des Arbres^Parls, France^02-955 3 6^John TrenfCat's House Cottage^burton-Underhill PD56-5BC Dors 4 set England^01-35-5624^James Mathieson^238 Parkway Drive^Philade

(Помните, что файл находится в памяти, а для того, чтобы его поместить туда, нужно использовать слово GETFILE.) Для обеспечения доступа к файлу адресов, выделения полей с помощью разделителей мы воспользуемся идеями предыдущего раздела. Итак, в переменную DELIMITER нужно записать код 94, который будет помечать конец каждого поля. Теперь пусть POSITION указывает на начало имени. Проще всего вывести имя и адрес; для этого можно воспользоваться словом FILEWORD из упражнения 2 предыдущего раздела. Слово : PRINT-RECORD ( -- ) ( Напечатать_запись) CR 4 0 DO DUP FILEWORD COUNT TYPE CR LOOP DROP ; решает эту задачу, если использовать его в следующем контексте: ADDFILE PRINT-RECORD

Но как найти начало поля имени? Для этого мы должны иметь возможность искать имя, помещая указатель POSITION в начало поля имени. Поэтому нам потребуется строковая переменная, в которую мы поместим строку для поиска: 80 $VARIABLE SEARCH$

Нам нужно также иметь слово, которое возвращало бы указатель (POSITION) снова в начало поля, предполагая, что содержимое поля хранится в PAD; это слово мы будем использовать, чтобы после того, как поиск завершится успешно, переместить указатель в начало.поля имени: : POINTBACK PAD С@ 1+ NEGATE POSITION +! :

Слово POINTBACK вычитает длину поля плюс разделитель из значения, хранимого в POSITION. Нужно также распознавать, когда мы дойдем до конца файла. Мы будем делать это, используя признак конца файла в последнем поле имени, в качестве которого выберем строку "&&&", определив ее как константу: $CONSTANT EOF &&&"

Далее мы воспользуемся некоторыми словами для работы со строками из версии MMSFORTH, которые вы можете заменить собственными аналогами, если посмотрите их определения в гл. 9.) Приведенное ниже слово будет возвращать в стек флаг истина, если в строке, адрес которой находится в стеке, будет встречен признак конца файла: : ?EOF ( $адр -- флаг ) EOF INSTR 0= 0= ; (Чтобы понять, как используется слово INSTR, посмотрите пример с телефонным справочником в гл. 9.) Теперь мы можем определить слово SEARCH-NAME ( -- ) (Искать_имя) BEGIN ADDFILE FILEWQRD DUP DUP ?EOF IF POINTBACK CR ." Имя не найдено" ABORT THEN SEARCH$ INSTR DUP IF POINTBACK CR SWAP COUNT TYPE ." найдено" CR ABORT THEN UNTIL ;




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