Слово :

Материал из ПМК вики
Перейти к навигации Перейти к поиску
Версия для печати больше не поддерживается и может содержать ошибки обработки. Обновите закладки браузера и используйте вместо этого функцию печати браузера по умолчанию.

: (двоеточие) — стандартное порождающее слово Каллисто.

:              ( −− )                               Начать определение слова через двоеточие.
Пример работы слова :

Сразу после двоеточия должно идти имя определяемого слова. Определение нового слова заканчивается словом ;.

Старые слова можно переопределять заново, но это вызовет предупреждение.

Ввод слова :

В режиме NUM нажмите чёрную клавишу  В/О 

: в стандарте ANS Forth

 6.1.0450   :                                  "colon"                      CORE
            ( C: "<spaces>name" -- colon-sys )
            Пропускает ведущие разделители пробелы. Выделяет name, ограниченное 
            пробелом. Создает определение для name, называемое "определение 
            через двоеточие". Вводит состояние компиляции и начинает текущее 
            определение, создавая colon-sys. Добавляет семантику инициирования, 
            данную ниже к текущему определению.

            Семантика выполнения name будет определяться скомпилированными в 
            тело определения словами. Текущее определение не должно быть 
            находимым в словаре, пока оно не закончено (или до выполнения DOES> 
            в некоторых системах).

        Инициирование: ( i*x -- i*x )  ( R:  -- nest-sys )
            Сохраняет зависящую-от-реализации информацию nest-sys о вызове 
            определения. Состояние стека i*x, представляет параметры для name.

        name Выполнение: ( i*x -- j*x )
            Выполняет name определения. Состояние стека i*x, и j*x представляет 
            параметры и результаты из name, соответственно.

        См.: 3.4 Интерпретатор текста Forth, 3.4.1 Синтаксический анализ, 
            3.4.5 Компиляция, 6.1.1250 DOES>, 6.1.2500 [, 6.1.2540 ], 
            15.6.2.0470 ;CODE.

 A.6.1.0450   :
 Типичное использование:
        : name ... ;

 В Forth 83 это слово было определено для изменения порядка поиска. Эта 
 спецификация явно удалена в этом Стандарте. Мы полагаем, что в большинстве 
 случаев это не имеет никакого эффекта; однако системы, которые разрешают много 
 порядков поиска, нашли Forth-83 поведение двоеточия очень нежелательным.

 Заметьте, что двоеточие самостоятельно не вызывает компилятор. Двоеточие 
 устанавливает состояние компиляции так, чтобы более поздние слова в области 
 анализа были откомпилированы.

История

Слово : является одним из самых древних сохранившихся слов Форта. Впервые оно появилось в программе CURVE (по информации из журнала «Байт» за август 1980 года, стр. 76 она называлась TRANSPORT), написанной Чак Муром на Алголе в 1964 году для Burroughs B5500 (Национальная ускорительная лаборатория SLAC, Стэнфордский университет). Слово : отмечало позицию во входной строке для отложенной интерпретации. Эта первая, написанная на Алголе, версия слова : называлась DEFINE

Слово : взято Чаком Муром из формата меток Алгола, перевёрнутого для паржинга слева направо, чтобы предотвратить интерпретатор от встречи неопределённого слова:

На Алголе — МЕТКА:
На CURVE — : МЕТКА

Вот пример одного из ранних определений Чаком Муром слова Форта для 2К×48бит версии на Burroughs B-5500 (1970 год), которое выглядит, как современное:

: SHIFT      -1   @T    0   -3   =T   ;

В Каллисто : не влияет на контекст, то есть ведёт себя также, как в Форте-94 и последующих.

В colorForth двоеточие было убрано, определяемые слова просто выделяются красным цветом.

: в предыдущем стандарте Forth-83 (англ.)

      :            -- sys                        M,79           "colon"
           A defining word executed in the form:
                   : <name> ... ;
           Create a word definition for <name> in the compilation
           vocabulary and set compilation state.  The search order is
           changed so that the first vocabulary in the search order is
           replaced by the compilation vocabulary.  The compilation
           vocabulary is unchanged.  The text from the input stream is
           subsequently compiled.  <name> is called a "colon
           definition".  The newly created word definition for <name>
           cannot be found in the dictionary until the corresponding ;
           or ;CODE is successfully processed.

           An error condition exists if a word is not found and cannot
           be converted to a number or if, during compilation from mass
           storage, the input stream is exhausted before encountering ;
           or ;CODE .  sys is balanced with its corresponding ; .  See:
           "compilation"  "9.4 Compilation"

: в стандарте Forth-79 (англ.)

 :                                            116            "colon"
     A defining word executed in the form:
          :  <name>  ...  ;
     Select  the  CONTEXT  vocabulary to be identical  to  CURRENT.
     Create  a  dictionary entry for <name>  in  CURRENT,  and  set
     compile   mode.    Words  thus  defined  are  called   'colon-
     definitions'.   The  compilation addresses of subsequent words
     from the input stream which are not immediate words are stored
     in  the  dictionary  to  be  executed  when  <name>  is  later
     executed.  IMMEDIATE words are executed as encountered.

     If a word is not found after a search of the CONTEXT and FORTH
     vocabularies,  conversion and compilation of a literal  number
     is attempted,  with regard to the current BASE;  that failing,
     an error condition exists .

: в fig-FORTH Release 1 glossary, май 1979 (англ.)

:                                           P,E,L0
       Used in the form called a colon-definition:
                  : cccc     ...     ;
       Creates a dictionary entry defining cccc as equivalent to the
       following sequence of Forth word definitions '...' until the next
       ';' or ';CODE'.
       The compiling process is done by the text interpreter as long as
       STATE is non-zero. Other details are that the CONTEXT vocabulary is
       set to the CURRENT vocabulary and that words with the precedence bit
       set (P) are executed rather than being compiled.

Реализация

Слово : содержит точку CALL адресного интерпретатора — обработчик слов высокого уровня, написанный на языке МК. Также в поле данных слова : содержится точка NEXT адресного интерпретатора, адрес которой записан в регистре 9.

Создающая часть слова : является высокоуровневой, то есть поле кода слова: содержит ссылку на точку CALL — ту самую, которая находится внутри поля данных.

 179 ; Следующие две подпрограммы вызваются косвенно через RC (КППС) из : и DOES>
 180 ; SETRIPRG и SETRIDAT внутри тела ":" содержат ссылки на RPUSHRIP и RPUSHRID
 181 
 182 ; Начало CALL при вызове из памяти программ.
 183 RPUSHRIP:
 184                 PPRM 9042                       ; RX := RI      ; Текущий указатель шитого кода
 185                 ENT RME / FANS <−> KINT M5 ∗ − KM2 RM5 KM2      ; RPUSH (RX)
 186                 RM7 RTN                         ; RX := W, оптимизация
 187 
 188 ;
 189 ; Начало CALL при вызове из памяти данных.
 190 RPUSHRID:
 191                 RM6 10001 +                     ; RX := RI      ; Текущий указатель шитого кода
 192                 ENT RME / FANS <−> KINT M5 ∗ − KM2 RM5 KM2      ; RPUSH (RX)
 193                 RM7 RTN                         ; RX := W, оптимизация
…
2458 ;               ∗∗ Управляющие слова ∗∗
2459 ;
2460 ;#Colon
2461 ; :                ( −− )                               Начать определение слова через двоеточие.
2462 LCOLON:         .DB     1
2463                 .TEXT   ":"                     ; ( "<пр>имя" −− )
2464                 .DW     LX
2465 COLON:          .DW CALL,QEXEC,SCSP,CREAT,SMUG
2466                 .DW RBRAC,PSCOD
2467 CALLD:                                          ;∗∗ CALL, когда управление передаётся в память данных
2468                 KGSBC                           ; RPUSH RI ; RX := W, адрес поля кода нового слова
2469                 1 +                             ; RX := PFA−1, передать в указатель шитого кода R6=RI−1
2470 SETRIDAT:
2471                 M6                              ; RI := RX
2472 SETDAT:         .NUMT RPUSHRID
2473                 MC                              ; RC := RPUSHRID        ;∗∗ Следующий вызов −− из памяти данных
2474                 .NUM NEXTD
2475                 M9                              ; R9 := NEXTD           ;∗∗
2476 NEXTD:                                          ; NEXT для шитого кода из памяти данных.
2477                 KRM6 RME ∗ KRM6 + M7            ; W := MEMW[RI++] считать шитый код
2478                 1 EE 4 −  FX>=0 NEXTPP          ; Слово из памяти программ?
2479 NEXTDD:         M7 M5 KRM7 RME ∗ KRM5 +         ; Считать MEMW[W], это должно быть CFA очередного слова в шитом коде
2480                 M8 KGOTO8                       ; передать управление на адрес, записанный в CFA
…
2490 CALL:                                           ;∗∗ CALL, когда управление передаётся в память программ
2491                 KGSBC                           ; RPUSH RI ; RX := W, адрес поля кода нового слова
2492                 2 +                             ; Теперь RX указывает на его тело
2493 SETRIPRG:
2494                 PPM 9042                        ; R9042 := RX
2495 SETPRG:         .NUMT RPUSHRIP
2496                 MC                              ; RC := RPUSHRIP        ;∗∗ Следующий вызов −− из памяти программ
2497                 .NUM NEXTP
2498                 M9                              ; R9 := NEXTP           ;∗∗
2499 NEXTP:                                          ; NEXT для шитого кода из памяти программ.
2500                 PPRM 9044 RME ∗ PPRM 9044 +
2501 DOEXECRX:       M7                              ; W := MEMW[RI++] считать шитый код
2502                 1 EE 4 − FX<0 NEXTDD            ; Слово из области двоичных данных?
2503 NEXTPP:         RM7 KPRGM RME ∗ RM7 1 + KPRGM + ; Считать MEMW[W], это должно быть CFA очередного слова в шитом коде
2504                 M8 KGOTO8                       ; передать управление на адрес, записанный в CFA

Реализации из SP-Forth 4.20:

: : ( C: "<spaces>name" -- colon-sys ) \ 94
\ Пропустить ведущие разделители. Выделить имя, ограниченное пробелом.
\ Создать определение для имени, называемое "определение через двоеточие".
\ Установить состояние компиляции и начать текущее определение, получив
\ colon-sys. Добавить семантику инициализации, описанную ниже, в текущее
\ определение. Семантика выполнения будет определена словами, скомпилиро-
\ ванными в тело определения. Текущее определение должно быть невидимо
\ при поиске в словаре до тех пор, пока не будет завершено.
\ Инициализация: ( i*x -- i*x ) ( R: -- nest-sys )
\ Сохранить информацию nest-sys о вызове определения. Состояние стека
\ i*x представляет аргументы имени.
\ Имя Выполнение: ( i*x -- j*x )
\ Выполнить определение имени. Состояния стека i*x и j*x представляют
\ аргументы и результаты имени соответственно.
  HEADER
  ]
  HIDE
;
: :  [T] : ALSO TC-IMM ;

(
 Во время компиляции "двоеточечного" определения в ЦК порядок поиска
 представляет собой такой пирог:

  TC-IMM    \ imm-слова управления, которые опасно переопределять
  TC-WL     \ создаваемый целевой список слов, он же в CURRENT
  TC        \ словарь определяющих слов ЦК - ":", CREATE, CONSTANT, etc
  FORTH     \ основной словарь инструментальной форт-системы
)

Советская реализация

Юрий Семёнов приводит следующее определение слова : (стр. 138):

 : :                                  ( второе ":" - имя слова)
       ?EXEC        ( система в режиме исполнения? Если нет, то
                      сообщение об ошибке)
       !CSP CURRENT @ CONTEXT !            ( CONTEXT = CURRENT)
       CREATE          ( формирует имя нового слова и поле LFA)
       ]                             ( вход в режим компиляции)
       (;CODE) ; IMMEDIATE             ( формирование поля CFA)

Описание и определение слова : в ядре ФОРТ-ЕС:

:         -> НАЧАТЬ ОПРЕДЕЛЕНИЕ СЛОВА ЧЕРЕЗ ДВОЕТОЧИЕ           32

                     Экран номер 32
( 31.03.86   CONSTANT  VARIABLE 2CONSTANT  2VARIABLE  : ; )

: : ( -> ) !CSP CREATE ] SMUDGE ;CODE
  RI RPUSH, RI 14 LR, RNEXT  BR,   END-CODE

Определение слова : в FORTH ИТЭФ:

   ;        ** Управляющие слова **

            HEAD     301Q,,272Q,COLON,$COL                ; :
            DW QEXEC,SCSP,CURR,AT,CONT,STORE,CREAT
            DW RBRAC,PSCOD
   $COL     LABEL   FAR
            ADD  BP, -2
            ADD  BX, 2
            MOV  [BP],   SI
            MOV  SI, BX
            NEXT

Ссылки


  Это заготовка статьи. Вы можете помочь проекту, дополнив её.