Архитектура Аудит Военная наука Иностранные языки Медицина Металлургия Метрология
Образование Политология Производство Психология Стандартизация Технологии


ИДЕНТИФИКАТОР И УКАЗАТЕЛЬ СПИСКА



Списки идентифицируются своими именами в словаре Форта.
При активации имен они выполняются как переменные, помещая
в вершину стека указатель на pfa слова-списка, т.е. идентифика-
тор списка,
или имя списка. Указатель, помещенный в pfa имени
списка, указывает на голову списка, поименованного данным
именем. Такой указатель называется указателем списка. Так как
Расположение pfa слова-списка относительно составляющих его
олей, известно, оно может быть использовано для представления

161


списка в качестве слова Форта. С другой стороны, при заданном
указателе списка невозможно узнать, где находится pfa соответ-
ствующего имени списка. Для работы же со списком требуется
указатель списка, который должен быть передан словам ПЕРВЫЙ
и ХВОСТ. Этот указатель, помещенный в стек, и будет называться
списком.

Рис. 7.3. Словарная структура списка, созданного словом

НОВСПИСОК. Указатель на голову списка помещен в pfa, а по адресу

pfa+2 находится указатель на НУЛЬ, отмечающий конец

списка (А В С)

При заданном имени списка указатель списка может (а часто
и должен) быть получен с помощью операции выборки @. В част-
ности, выделить указатель списка из имени списка II можно так:

1 1 @

Для того чтобы имя списка указывало на список, нужно
воспользоваться словом УСТАНОВИТЬ (SET), имеющим следую-
щую стековую нотацию:

(И ©СПИСОК-> )

где И - имя списка (его pfa), а @СПИСОК - указатель списка.
Если, например, ввести команды

И НУЛЬ УСТАНОВИТЬ
то список с именем II станет пустым (или нулевым).


42

О \ ЛИСПОПОДОБНЫЕ СЛОВА ПОСТРОЕНИЯ СПИСКОВ
t \ НА ФОРТЕ-83

2 ( НУЛЬ S 1 S 2... SN I -> ) \ ПОСТРОЕНИЕ СПИСКА С ИМЕНЕМ I

3 • СПИСОК > R

4     BEGIN DUP НОЛЬ NOT

5 WHILE R@ СВЯЗЬ

6 REPEATE R> 2DR O P

7;
8

9 ( (Э СПИСОК I -> ) \ РЕКУРСИВНОЕ ОПРЕДЕЛЕНИЕ 2СОЕД























СОЕД OVER НОЛЬ

I F2 DR0P

ELSE OVER Х ВОСТ OVER РЕКУРСИЯ

SWAP ПЕРВЫЙ SWAP СВЯЗЬ

THEN

15;

43

0 \ ЛИСПОПОДОБНЫЕ СЛОВА ПОСТРОЕНИЯ СПИСКОВ

1 \ НА ФОРТЕ-83

2 ( @ - > ФЛАГ) \ ФЛАГ = ИСТИНА,

3             \ ЕСЛИ @ ДАЕТ PFA ПЕРЕМЕННОЙ

4: ATOM? B O DY> @ ['] НУЛЬ @ =;

5 ( ©СПИСОК -> )

6: ВЫДАТЬСП CR." ("

BEGIN DUP ПЕРВЫЙ DUP ATOM?

IF DUP НОЛЬ NOT

9       I F B O DY> > NAME. I D ELSE DROP THEN

ELSE РЕКУРСИЯ

THEN Х ВОСТ DUP НОЛЬ

12 UNTIL 8 ( ЗАБОЙ ) EMIT." )" DROP
13;

14
15

44

0 \ ЛИСПОПОДОБНЫЕ СЛОВА ПОСТРОЕНИЯ СПИСКОВ

1 \ НА ФОРТЕ-83

2 ( @СПИСОК -> )

3: ВЫДАТЬ DUP @ НОЛЬ

 

4 I F DR OPC R." НУЛЬ"



ELSE DUP ATOM?

6            I F B O DY> > NAME. ID
ELSE ВЫДАТЬСП


THEN

^ T HEN
10;
11
12
13
14
15

Экраны 42, 43, 44. Слова построения списков: СПИСОК, 2СОЕД,
А ТОМ?, ВЫДАТЬСП и ВЫДАТЬ


 


162


6*


163














ВЫВОД СПИСКОВ НА ПЕЧАТЬ

Вывод списков на печать производится словом ВЫДАТЬ
(PRINT). Оно берет из стека указатель на список и выводит спи-
сок в скобочной записи. Для удобства восприятия длинных списков
каждая левая скобка начинается с новой строки. Чтобы вывести
список с именем 11, нужно ввести:

11 @ ВЫДАТЬ

Операция @ помещает на стек указатель списка с именем П.





В ВОД С ПИСКОВ

Слово- СВЯЗЬ представляет собой примитивную операцию по-
строения списков, однако такая операция не совсем удобна с точки
зрения пользователя. Слово СПИСОК (LIST) в этом отношении
несколько лучше. Оно берет элементы из стека и включает их в
список. Нуль в стеке отмечает начало списка. Стековая нотация
слова СПИСОК:

( НУЛЬ S1 S2... SN И -> )

где S1... SN - элементы, а II -имя списка. Результирующий
список с именем II следующий:

(S1 S2... SN)

Введя

И @ ВЫДАТЬ

вы увидите Э1*от список.

Элементы списка служат указателями на pfa переменных Фо-
рта. При активации слова СПИСОК слова с SI no SN уже должны
существовать. Но самый простой путь ввода списка - с помощью
ЧТСП (READL). Это слово представляет собой небольшой сим-
вольный интерпретатор, создающий списки из следующих объек-
тов: (, ), @, атомов и имени списка. ЧТСП обращается к ЧТСИМ
(READCH), которое выдает очередной символ из входного потока.
Оно воспринимает список только в скобочной записи. Чтобы ввести
список, нужно набрать:

I ЧТСП

где I - имя списка, а затем набрать список в скобочной записи. Ле-
вая круглая скобка ( начинает список, а правая ) заканчивает его.


Непосредственно можно ввести список только одного уровня. Та-
кой, например, список ввести сразу нельзя:

(A(BC)D)

поскольку в нем содержится внутренний список. В данной реализа-
ции каждый список должен быть определен через НОВСПИСОК.

45

0 \ ЛИСПОПОДОБНЫЕ СЛОВА ПОСТРОЕНИЯ СПИСКОВ

1 \ НА ФОРТЕ-83

2 ( -> С) \ ЧТЕНИЕ ОЧЕРЕДНОГО СИМВОЛА ИЗ ВХОДНОГО ПОТОКА
3: Ч ТСИМ

4 BEGIN ИСТОЧНИК > IN @ /STRING

5 I F С@ 1 > IN +! TRUE

6 ELSE DROP ['] ИСТОЧНИК > B O DY @ ['] (ИСТОЧНИК) =

7     I F QUERY ELSE 1 BLK +! 0 > IN! THEN FALSE




















THEN

9 UNTIL
1 0;

11 ( -> CFA ) \ ЕСЛИ СЛОВА НЕТ В СЛОВАРЕ,


СОЗДАЕТСЯ ПЕРЕМЕННАЯ

13: 7 CREATE > IN @ DEFINED

14 I F NIP ELSE DROP > IN! HERE VARIABLE 4 + NAME> THEN

15;

46

0 \ ЛИСПОПОДОБНЫЕ СЛОВА ПОСТРОЕНИЯ СПИСКОВ

1 \ НА ФОРТЕ-83

2 ( I -> )

3: ЧТСП > R

BEGIN ЧТСИМ

CASE BL

OF FALSE E ND OF ASCII (


Поделиться:



Последнее изменение этой страницы: 2019-03-29; Просмотров: 213; Нарушение авторского права страницы


lektsia.com 2007 - 2024 год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! (0.025 с.)
Главная | Случайная страница | Обратная связь