( Из Баранова: Стек данных как универсальное средство для передачи параметров и результатов между форт-словами имеет неоспоримые преимущества. Вместе с тем внутри определения он используется для промежуточных вычислений и размещения значений, которые в них участвуют. Это вызывает определенные трудности для доступа к такому локальному значению, поскольку его положение относительно вершины стека постоянно меняется. Для упрощения работы желательно закрепить за локальным объектами внутри определения некоторые постоянные имена, через которые и осуществлять доступ к ним. Имеющийся в языке механизм описания переменных в данном случае не подходит, поскольку создает глобальные имена, тогда как требуется именовать локальные объекты, учитывая при этом возможность рекурсивных вызовов. Поставленную задачу решает включение в работу дополнительного стека, отличного от стека данных. Локальные значения размещаются в этом стеке при входе в определение и убираются из него при выходе. На все время исполнения определения их положение относительно вершины стека остается постоянным, это позволяет организовать очень простой доступ к таким значениям. Простейшая надстройка над языком Форт, которая позволяет работать с локальными переменными, выглядит так:) 100 ALLOT HERE CONSTANT LP0 ( НАЧАЛО ЛОК.СТЕКА) VARIABLE LP ( ТЕКУЩАЯ ВЕРШИНА ЛОКАЛЬНОГО СТЕКА) : INITLP ( ->) LP0 LP ! ; INITLP : LOC ( N:СЧЕТЧИК->) 1+ CELLS LP @ OVER - DUP LP ! ! ; : UNLOC ( ->) LP @ @ LP +! ; : @@ ( N:СМЕЩ->) CREATE , DOES> ( PFA->A) @ CELLS LP @ + @ ; : !! ( N:СМЕЩ->) CREATE , DOES> ( A,PFA->) @ CELLS LP @ + ! ; 1 @@ @1 2 @@ @2 3 @@ @3 4 @@ @4 5 @@ @5 ( И Т.Д.) 1 !! !1 2 !! !2 3 !! !3 4 !! !4 5 !! !5 ( И Т.Д.)