0=: различия между версиями
AtH (обсуждение | вклад) |
AtH (обсуждение | вклад) |
||
(не показано 38 промежуточных версий этого же участника) | |||
Строка 1: | Строка 1: | ||
'''0=''' (нулю равно) — стандартное слово [[Каллисто]]. | '''0=''' (нулю равно) — стандартное слово [[Каллисто]]. Проверить на равенство нулю. | ||
0= ( x -- f ) | 0= ( x -- f ) Проверка на равенство нулю. | ||
[[Файл:CallistoLogic.png|thumb|right|264px|Пример работы слова 0=]] | |||
Сравнивает x с [[FALSE|нулём]] и засылает в стек флаг «истинно» (f=−1), если x равен нулю и [[FALSE|флаг «ложно»]] (f=0), если x отличен от нуля. | |||
== Ввод слова 0= == | |||
В [[Режим NUM|режиме NUM]] последовательно нажмите три клавиши [[Клавиша 0|{{Серая клавиша|0}}]] [[Клавиша F|{{Оранжевая клавиша|F}}]] {{ШГ←}} | |||
== | == 0= и F0= в стандарте ANS Forth == | ||
6.1.0270 0= "zero-equals" CORE | 6.1.0270 0= "zero-equals" CORE | ||
( x -- flag ) | ( x -- flag ) | ||
flag - true, если и только если x - равно нулю. | flag - true, если и только если x - равно нулю. | ||
12.6.1.1450 F0= "f-zero-equals" FLOATING | 12.6.1.1450 F0= "f-zero-equals" FLOATING | ||
( -- flag ) ( F: r -- ) or ( r -- flag ) | ( -- flag ) ( F: r -- ) or ( r -- flag ) | ||
flag - true, если и только если r - равно нулю. | flag - true, если и только если r - равно нулю. | ||
== 0= в предыдущем стандарте Forth-83 (англ.) == | == История == | ||
В 1968 году Чак Мур работал в Mohasco Industries, Inc ([https://en.wikipedia.org/wiki/Amsterdam_%28city%29,_New_York 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" | 0= w -- flag 83 "zero-equals" | ||
flag is true if w is zero. | flag is true if w is zero. | ||
== 0= в стандарте Forth-79 (англ.) == | === 0= в стандарте Forth-79 (англ.) === | ||
0= n -- flag 180 "zero-equals" | 0= n -- flag 180 "zero-equals" | ||
True if n is zero. | True if n is zero. | ||
== 0= в fig-FORTH Release 1 glossary, май 1979 (англ.) == | === 0= в fig-FORTH Release 1 glossary, май 1979 (англ.) === | ||
0= n --- f L0 | 0= n --- f L0 | ||
Leave a true flag is the number is equal to zero, otherwise leave a | Leave a true flag is the number is equal to zero, otherwise leave a | ||
false flag. | false flag. | ||
== | == Реализация == | ||
Если на стеке лежит логическое значение (флаг), слово 0= меняет его противоположное. Флаг «истинно» (x=−1 и любое ненулевое значение) превращается во флаг «ложно» (f=0). Флаг «ложно» (x=0) превратится во флаг «истинно» (f=−1). Этим объясняется широкая практика использования 0= для логического отрицания. Фактически это слово NOT, и во многих Фортах оно имеет такое второе название. | |||
Слово 0= возвращает −1 в качестве флага «истинно», что позволяет использовать результат f в логических операция [[AND]], [[OR]], [[XOR]] и [[NOT]]. Разумеется, при этом другие аргументы этих операций тоже должны использовать −1 в качестве флага «истинно». Все слова [[Каллисто]], возвращающие флаги, используют в качестве флага «истинно» −1. | |||
В отличии от [[NOT|каллистянского NOT]], слово 0= превращает во флаг «ложь» не только −1, но и любое ненулевое значение. Применив 0= дважды, можно «нормализовать» флаг, превратив любое ненулевое значение в −1. | |||
<pre> | |||
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 | |||
</pre> | |||
Реализации из SP-Forth 4.20: | |||
<pre> | |||
CODE 0= ( x -- flag ) \ 94 | |||
\ flag "истина" тогда и только тогда, когда x равно нулю. | |||
SUB EAX, # 1 | |||
SBB EAX, EAX | |||
RET | |||
END-CODE | |||
</pre> | |||
<pre> | |||
\ \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ | |||
\ 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 | |||
</pre> | |||
=== Советская реализация === | |||
Слово 0= в ФОРТ-ЕС было [[примитив]]ом. Вот его описание и определение: | |||
<PRE> | |||
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 | |||
</PRE> | |||
В FORTH ИТЭФ слово 0= тоже было [[примитив]]ом, вот его определение: | |||
<PRE> | |||
; ** Стандартные слова ** | |||
; ** Условные операторы ** | |||
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 | |||
</PRE> | |||
== Ссылки == | == Ссылки == | ||
* См. слова [[ | * {{Исходник|ZeroEqual|0=}} | ||
* [http://forth.sourceforge.net/standard/dpans/dpans6.htm#6.1.0270 | * См. слова [[NOT]], [[Слово =|=]], [[0⟨|0<]] и [[0⟩|0>]] | ||
* См. также [[=|символ =]] | |||
* [http:// | * Слова [http://forth.sourceforge.net/standard/dpans/dpans6.htm#6.1.0270 0= (zero-equals)] и [http://forth.sourceforge.net/standard/dpans/dpans12.htm#12.6.1.1450 F0= (f-zero-equals)] в стандарте ANS Forth ''(англ.)'' | ||
* [http:// | * Слова [http://forth-standard.org/standard/core/ZeroEqual 0= (zero-equals)] и [http://forth-standard.org/standard/float/FZeroEqual F0= (f-zero-equals)] в черновике Forth 200x ''(англ.)'' | ||
* [http://gudleifr.h1.ru/cgi-bin/pilo.cgi?FL=../g9.txt&IS=\6.PERWOISTOTNIKI\LEO%20BRODIE%20STARTING%20FORTH\04.%20KOMPJUTER%20%22PRINIMAET%20RESENIA%22 КОМПЬЮТЕР "ПРИНИМАЕТ РЕШЕНИЯ"] в книге [http://gudleifr.h1.ru/cgi-bin/pilo.cgi?FL=../g9.txt&IS=\6.PERWOISTOTNIKI\LEO%20BRODIE%20STARTING%20FORTH Л.Броуди «Начальный курс программирования на языке Форт»] | |||
* [http://www.forth.com/starting-forth/sf4/sf4.html Decisions, Decisions…] в книге [http://www.forth.com/starting-forth/ Leo Brodie Starting Forth] ''(англ.)'' | |||
{{заготовка}} | {{заготовка}} | ||
[[Категория:Слова Каллисто]] | [[Категория:Слова Каллисто]] | ||
[[Категория:Примитивы]] | |||
[[Категория:Одноместные операции Каллисто]] | [[Категория:Одноместные операции Каллисто]] | ||
[[Категория:Операции сравнения Каллисто]] | [[Категория:Операции сравнения Каллисто]] | ||
[[Категория: | [[Категория:Стандартные слова]] | ||
[[Категория:1994 CORE]] | |||
[[Категория:2012 CORE]] |
Текущая версия от 17:26, 10 ноября 2017
0= (нулю равно) — стандартное слово Каллисто. Проверить на равенство нулю.
0= ( x -- f ) Проверка на равенство нулю.
Сравнивает 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
Ссылки[править]
- Исходный текст слова 0= в Каллисто Классик 1.0
- См. слова NOT, =, 0< и 0>
- См. также символ =
- Слова 0= (zero-equals) и F0= (f-zero-equals) в стандарте ANS Forth (англ.)
- Слова 0= (zero-equals) и F0= (f-zero-equals) в черновике Forth 200x (англ.)
- КОМПЬЮТЕР "ПРИНИМАЕТ РЕШЕНИЯ" в книге Л.Броуди «Начальный курс программирования на языке Форт»
- Decisions, Decisions… в книге Leo Brodie Starting Forth (англ.)
Это заготовка статьи. Вы можете помочь проекту, дополнив её. |