?DUP
?DUP (вопрос-дублировать, читается «вопрос-дуп») — стандартное слово Каллисто. Осуществляет операцию ↑ если x≠0 (истина).
?DUP ( x −− 0 | x x ) Дублировать, если x<>0.
Дублирует верхнее значение, если это не ноль, и оставляет стек в исходном состоянии, если на вершине ноль.
Ввод слова ?DUP[править]
В режиме NUM последовательно нажмите клавиши K Р-ГРД-Г K 3 6
Для возврата в режим NUM нажмите синюю клавишу P .
?DUP в стандарте ANS Forth[править]
6.1.0630 ?DUP "question-dupe" CORE ( x -- 0 | x x ) Дублирует x, если оно ненулевое.
История[править]
При переносе на Каллисто старых программ, написанных для fig-Форта, нужно заменять старое наименование −DUP на новое ?DUP
В Форте FSP88M это слово известно под именем ?DU (три литеры).
Слово ?DUP подвергается критике, т.к. оставляет на стеке разное количество элементов, что является плохим стилем программирования. Чаще всего ?DUP используется для компенсации того, что IF снимает со стека свой аргумент.
В colorForth слово ?DUP нет, т.к. IF там неразрушающий. В cf2019 слово ?DUP используется для оптимизации макросов и аналогично DUP за одним исключением — будучи использованным после DROP , вместо компиляции DUP «отменяет» компиляцию этого DROP .
?DUP в предыдущем стандарте Forth-83 (англ.)[править]
?DUP 16b -- 16b 16b 79 "question-dupe" or 0 -- 0 Duplicate 16b if it is non-zero.
?DUP в стандарте Forth-79 (англ.)[править]
?DUP n -- n ( n ) 184 "query-dupe" Duplicate n if it is non-zero.
−DUP в fig-FORTH Release 1 glossary, май 1979 (англ.)[править]
-DUP n1 -- n1 (if zero) n1 -- n1 n1 (non-zero) L0 Reproduce n1 only if it is non-zero. This is usually used to copy a value just before IF, to eliminate the need for an ELSE part to drop it.
Реализация[править]
1910 ;#qDUP 1911 ; ?DUP ( x −− 0 | x x ) Дублировать, если x≠0. 1912 LQDUP: .DB 4 1913 .TEXT "?DUP" 1914 .DW LDUP 1915 QDUP: .DW JQDUP 1916 JQDUP: PKRM03 KX!=09 ; Если x<>0 1917 KM3 KGOTO9 ; ..делает DUP
Реализации в SP-Forth 4.20[править]
CODE1 ?DUP ( x -- 0 | x x ) \ 94 \ Продублировать x, если не ноль. OR EAX, EAX JNZ ' DUP RET ;C
CODE C-?DUP OR EAX, EAX JZ SHORT @@1 LEA EBP, -4 [EBP] MOV [EBP], EAX @@1: RET END-CODE … : ?DUP STATE @ IF HERE TO :-SET ['] C-?DUP INLINE, HERE TO :-SET \ нужно как в THEN ELSE ?DUP THEN ; IMMEDIATE
: ?DUP STATE @ IF HERE TO :-SET S" C-?DUP" TC-FINDOUT INLINE, HERE TO :-SET ELSE ?DUP THEN ; IMMEDIATE
Советская реализация[править]
У Баранова-Ноздрунова приводится следующее определение слова ?DUP (стр. 29):
: ?DUP ( A ---> A,A / 0 ) ↑ IF ↑ THEN ;
Описание и определение слова ?DUP в ядре ФОРТ-ЕС:
?DUP W->W,W ПРОДУБЛИРОВАТЬ W, ЕСЛИ ЭТО НЕ НУЛЬ 9 Экран номер 9 ( 31.03.86 DUP ?DUP DROP SWAP OVER >R R> R@ RDROP ROT ) : ?DUP ( W->W,W| 0->0 ) DUP IF DUP THEN ;
В FORTH ИТЭФ слово ?DUP называлось −DUP и было примитивом, который опирался на код примитива DUP, вот их определения:
HEAD 203Q,'DU',320Q,DUBL ; DUP POP AX DU: PUSH AX C$: PUSH AX NEXT HEAD 204Q,'-DU',320Q,DDUP ; -DUP POP AX CMP AX, 0 JNE DU JMP C$
Ссылки[править]
- Исходный текст слова ?DUP в Каллисто Классик 1.0
- См. слова ↑ и 2DUP
- Слово ?DUP (question-dupe) в стандарте ANS Forth (англ.)
- Слово ?DUP (question-dupe) в черновике Forth 200x (англ.)
- КОМПЬЮТЕР "ПРИНИМАЕТ РЕШЕНИЯ" в книге Л.Броуди «Начальный курс программирования на языке Форт»
- Decisions, Decisions… в книге Leo Brodie Starting Forth (англ.)
У этой статьи нет иллюстраций. Вы можете помочь проекту, добавив их. |
Это заготовка статьи. Вы можете помочь проекту, дополнив её. |