0=

Материал из ПМК вики
Версия от 17:26, 10 ноября 2017; AtH (обсуждение | вклад) (→‎Реализация)
(разн.) ← Предыдущая версия | Текущая версия (разн.) | Следующая версия → (разн.)
Перейти к навигации Перейти к поиску

0= (нулю равно) — стандартное слово Каллисто. Проверить на равенство нулю.

0=             ( x -- f )                      Проверка на равенство нулю.
Пример работы слова 0=

Сравнивает x с нулём и засылает в стек флаг «истинно» (f=−1), если x равен нулю и флаг «ложно» (f=0), если x отличен от нуля.

Ввод слова 0=[править]

В режиме NUM последовательно нажмите три клавиши  0     F   ШГ← 

0= и F0= в стандарте ANS Forth[править]

6.1.0270   0=                             "zero-equals"                    CORE
           ( x -- flag )
           flag - true, если и только если x - равно нулю.
12.6.1.1450   F0=                       "f-zero-equals"                FLOATING
           ( -- flag ) ( F: r -- ) or ( r -- flag )
           flag - true, если и только если r - равно нулю.

История[править]

В 1968 году Чак Мур работал в Mohasco Industries, Inc (Amsterdam NY, англ.). Первая версия интерпретатора, получившая название FORTH, заработала на миникомпьютере IBM 1130 с графическим дисплеем 2250 (16-битный процессор с ОЗУ 8К, дисководом, клавиатурой, принтером и ридером/панчером перфокарт). Первый FORTH знал слово 0=

В Форте-79 слово NOT было определено, как синоним 0=

Если программы переносятся с Форта-79 или fig-Форта на Каллисто, их слово NOT должно заменяться на 0=

0= в предыдущем стандарте Forth-83 (англ.)[править]

     0=           w -- flag                     83       "zero-equals"
          flag is true if w is zero.

0= в стандарте Forth-79 (англ.)[править]

0=             n -- flag                     180      "zero-equals"
    True if n is zero.

0= в fig-FORTH Release 1 glossary, май 1979 (англ.)[править]

0=            n  ---  f                        L0
       Leave a true flag is the number is equal to zero, otherwise leave a
       false flag.

Реализация[править]

Если на стеке лежит логическое значение (флаг), слово 0= меняет его противоположное. Флаг «истинно» (x=−1 и любое ненулевое значение) превращается во флаг «ложно» (f=0). Флаг «ложно» (x=0) превратится во флаг «истинно» (f=−1). Этим объясняется широкая практика использования 0= для логического отрицания. Фактически это слово NOT, и во многих Фортах оно имеет такое второе название.

Слово 0= возвращает −1 в качестве флага «истинно», что позволяет использовать результат f в логических операция AND, OR, XOR и NOT. Разумеется, при этом другие аргументы этих операций тоже должны использовать −1 в качестве флага «истинно». Все слова Каллисто, возвращающие флаги, используют в качестве флага «истинно» −1.

В отличии от каллистянского NOT, слово 0= превращает во флаг «ложь» не только −1, но и любое ненулевое значение. Применив 0= дважды, можно «нормализовать» флаг, превратив любое ненулевое значение в −1.

 866 ;               ∗∗ Стандартные слова ∗∗
 867 ;               ∗∗ Условные операторы ∗∗
 868 ;
 869 ;#ZeroEqual
 870 ; 0=               ( x −− f )                           Проверить на равенство нулю.
 871 ; Слово 0= часто используется, как логическое отрицание NOT. Заменяет 0 на −1 и наоборот.
 872 LZEQU:          .DB     2
 873                 .TEXT   "0="                    ; ( x −− флаг )
 874                 .DW     LIPRG
 875 ZEQU:           .DW     JZEQU
 876 JZEQU:          PKRM03  PX!=0 STT
 877 STF:            Cx PKM03  KGOTO9                ; [SP] := 0; NEXT
…
 886 STT:            1 +/− PKM03  KGOTO9             ; [SP] := −1; NEXT

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

CODE 0= ( x -- flag ) \ 94
\ flag "истина" тогда и только тогда, когда x равно нулю.
     SUB   EAX, # 1
     SBB   EAX, EAX
     RET
END-CODE
\ \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\

\ Operations
\ \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\


CODE F0=      \ *
       LEA EBP, -4 [EBP]
       MOV [EBP], EAX
       XOR EBX, EBX
       FTST
       FFREE ST
       FINCSTP
       FSTSW EAX
       SAHF
       JNZ SHORT @@1
       MOV EBX, # -1
@@1:   MOV EAX, EBX
       RET
END-CODE

Советская реализация[править]

Слово 0= в ФОРТ-ЕС было примитивом. Вот его описание и определение:

0=           W->F F "ИСТИНА", ЕСЛИ N РАВНО НУЛЮ                13

                     Экран номер 13
( 31.03.86      AND  OR XOR  NOT  0=  0<      )

CODE O= ( W->F) RW1 RW1 SR,   RW2 PULL,  RW2 RW2 LTR,
  PUTRW1 BNZ,   RW1 0 BCTR,    PUTRW1 B,   END-CODE

В FORTH ИТЭФ слово 0= тоже было примитивом, вот его определение:

   ;         **  Стандартные слова  **
   ;         **  Условные операторы  **

             HEAD    202Q,'0',275Q,ZEQU                   ; 0=
             POP   AX
             CMP   AX,  0
             JE    TRUE
   FALSE:    SUB   AX,  AX
   PUT:      PUSH  AX
             NEXT
   TRUE:     MOV   AX,  1
             JMP   PUT

Ссылки[править]


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