В: Другие утилиты, описанные в этой книге
ПРИЛОЖЕНИЕ В
Д Р У Г И Е У Т И Л И Т Ы , ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ О П И С А Н Н Ы Е В Э Т О Й К Н И Г Е ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
----------------------------------------------------------------
Это приложение призвано помочь Вам определить некоторые из слов, которые упоминались в этой книге и которые могут отсутствовать в Вашей системе. Определения даны в Стандарте-83.
ИЗ ГЛАВЫ 4.
Определение слова ASCII для работы в Стандарте-83:
: ASCII ( -- c) \ компиляция: с ( -- ) \ интерпретация: с ( -- с) BL WORD 1+ C@ STATE @ IF [COMPILE] LITERAL TNEN ; IMMEDIATE
ИЗ ГЛАВЫ 5.
Слово \ можно определить как:
: \ ( пропустить остаток строки ) >IN @ 64 / 1+ 64 * >IN ! ; IMMEDIATE
Если Вы решили не использовать слово EXIT для прерывания интерпретации блока, то можете определить слово \S как
: \S 1024 >IN ! ;
Слово FH определяется просто как
: FH \ ( смещение -- блок-по-смещению ) \ "from here" - "отсюда" BLK @ + ;
Подобная факторизация позволяет использовать FH многими способами, типа:
: TEST [ 1 FH ] LITERAL LOAD ; - 290 -
или
: SEE [ 2 FH ] LITERAL LIST ;
Несколько более сложная версия этого слова позволяет также редактировать или загружать блоки фразами вида "14 FH LIST", работающими относительно последнего блока, который был напечатан LISTом (SCR):
: FH \ ( смещение -- блок-по-смещению ) \ "from here" - "отсюда" BLK @ ?DUP 0= IF SCR @ THEN + ;
Слово BL - это просто константа:
32 CONSTANT BL
TRUE и FALSE могут быть определены так:
0 CONSTANT FALSE -1 CONSTANT TRUE
(Слова структур управления Форта, такие, как IF и UNTIL, рассматривают нуль как "ложь" и любое ненулевое значение как "истину". До Форта-83 соглашение предусматривало показывать "истину" значением 1. Начиная с '83-го стандарта, однако, "истина" имеет значение FFFF (шестнадцатеричное), что соответствует числу со знаком -1 (все биты установлены). Слово WITHIN на высоком уровне можно определить так:
: WITHIN ( n низ верх+1 -- ? ) OVER - >R - >R U< ;
ИЗ ГЛАВЫ 8.
Реализация слова LEAP будет зависеть от того, как Ваша система реализует циклы DO LOOP. Если DO держит два значения на стеке возвратов (индекс и ограничитель), LEAP должно их оба сбрасывать, плюс сбрасывать еще одно значение со стека возвратов для выхода:
: LEAP R> R> 2DROP R> DROP ;
Если DO держит `три` значения на стеке возвратов, то следует определить:
: LEAP R> R> 2DROP R> R> 2DROP ;
---------------------------------------------------------------- - 291 -