Слово :
: (двоеточие) — стандартное порождающее слово Каллисто.
: ( −− ) Начать определение слова через двоеточие.
Сразу после двоеточия должно идти имя определяемого слова. Определение нового слова заканчивается словом ;.
Старые слова можно переопределять заново, но это вызовет предупреждение.
Ввод слова :[править]
В режиме 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
Ссылки[править]
- Исходный текст слова : в Каллисто Классик 1.0
- См. слово ; и символ ':'
- Слово : (colon) и комментарий к нему в стандарте ANS Forth (англ.)
- Слово : (colon) и комментарий к нему в черновике Forth 200x (англ.)
- ОСНОВЫ ФОРТА в книге Л.Броуди «Начальный курс программирования на языке Форт»
- Fundamental Forth в книге Leo Brodie Starting Forth (англ.)
Это заготовка статьи. Вы можете помочь проекту, дополнив её. |