Subversion Repositories Kolibri OS

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
4867 leency 1
( Из Баранова:
2
  Стек данных как универсальное средство для передачи параметров и результатов
3
между форт-словами имеет неоспоримые преимущества. Вместе с тем внутри
4
определения он используется для промежуточных вычислений и размещения значений,
5
которые в них участвуют. Это вызывает определенные трудности для доступа к
6
такому локальному значению, поскольку его положение относительно вершины стека
7
постоянно меняется.
8
  Для упрощения работы желательно закрепить за локальным объектами внутри
9
определения некоторые постоянные имена, через которые и осуществлять доступ к
10
ним.
11
  Имеющийся в языке механизм описания переменных в данном случае не подходит,
12
поскольку создает глобальные имена, тогда как требуется именовать локальные
13
объекты, учитывая при этом возможность рекурсивных вызовов. Поставленную задачу
14
решает включение в работу дополнительного стека, отличного от стека данных.
15
Локальные значения размещаются в этом стеке при входе в определение и убираются
16
из него при выходе.
17
  На все время исполнения определения их положение относительно вершины стека
18
остается постоянным, это позволяет организовать очень простой доступ к таким
19
значениям.
20
  Простейшая надстройка над языком Форт, которая позволяет работать с локальными
21
переменными, выглядит так:)
22
 
23
 
24
100 ALLOT   HERE CONSTANT LP0 ( НАЧАЛО ЛОК.СТЕКА)
25
VARIABLE LP  ( ТЕКУЩАЯ ВЕРШИНА ЛОКАЛЬНОГО СТЕКА)
26
: INITLP ( ->)  LP0 LP ! ; INITLP
27
: LOC ( N:СЧЕТЧИК->) 1+ CELLS LP @ OVER - DUP LP ! ! ;
28
: UNLOC ( ->)  LP @ @ LP +! ;
29
: @@ ( N:СМЕЩ->) CREATE , DOES> ( PFA->A) @ CELLS LP @ + @ ;
30
: !! ( N:СМЕЩ->) CREATE , DOES> ( A,PFA->) @ CELLS LP @ + ! ;
31
 
32
1 @@ @1  2 @@ @2  3 @@ @3  4 @@ @4  5 @@ @5 ( И Т.Д.)
33
 
34
1 !! !1  2 !! !2  3 !! !3  4 !! !4  5 !! !5 ( И Т.Д.)