Текущая версия |
Ваш текст |
Строка 1: |
Строка 1: |
| '''?DUP''' (вопрос-дублировать, читается «вопрос-дуп») — стандартное слово [[Каллисто]]. Осуществляет операцию [[Слово ↑|↑]] если x≠0 (истина). | | '''?DUP''' — стандартное слово [[Каллисто]]. |
| ?DUP ( x −− 0 | x x ) Дублировать, если x<>0.
| |
| Дублирует верхнее значение, если это не ноль, и оставляет [[Стек данных|стек]] в исходном состоянии, если на вершине ноль.
| |
| | |
| == Ввод слова ?DUP ==
| |
| В [[Режим NUM|режиме NUM]] последовательно нажмите клавиши [[Клавиша K|{{Синяя клавиша|K}}]] [[Клавиша Р-ГРД-Г|{{Чёрная клавиша|Р-ГРД-Г}}]] [[Клавиша K|{{Синяя клавиша|K}}]] [[Клавиша 3|{{Серая клавиша|3}}]] [[Клавиша 6|{{Серая клавиша|6}}]]
| |
| | |
| Для возврата в [[режим NUM]] нажмите [[Клавиша P|синюю клавишу {{Синяя клавиша|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.
| |
| | |
| == Реализация ==
| |
| <pre>
| |
| 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
| |
| </pre>
| |
| | |
| === Реализации в SP-Forth 4.20 ===
| |
| <pre>
| |
| CODE1 ?DUP ( x -- 0 | x x ) \ 94
| |
| \ Продублировать x, если не ноль.
| |
| OR EAX, EAX
| |
| JNZ ' DUP
| |
| RET
| |
| ;C
| |
| </pre>
| |
| <pre>
| |
| 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
| |
| </pre>
| |
| <pre>
| |
| : ?DUP STATE @
| |
| IF HERE TO :-SET
| |
| S" C-?DUP" TC-FINDOUT INLINE,
| |
| HERE TO :-SET
| |
| ELSE ?DUP
| |
| THEN ; IMMEDIATE
| |
| </pre>
| |
| | |
| === Советская реализация ===
| |
| У Баранова-Ноздрунова приводится следующее определение слова ?DUP (стр. 29):
| |
| : ?DUP ( A ---> A,A / 0 ) ↑ IF ↑ THEN ;
| |
| | |
| Описание и определение слова ?DUP в ядре ФОРТ-ЕС:
| |
| <PRE>
| |
| ?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 ;
| |
| </PRE>
| |
| В FORTH ИТЭФ слово ?DUP называлось −DUP и было [[примитив]]ом, который опирался на код [[примитив]]а [[Слово ↑|DUP]], вот их определения:
| |
| <PRE>
| |
| 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$
| |
| </PRE>
| |
|
| |
|
| == Ссылки == | | == Ссылки == |
| * {{Исходник|qDUP|?DUP}} | | * [http://forth.sourceforge.net/standard/dpans/dpans6.htm#6.1.0630 Слово ?DUP (question-dupe) в стандарте ANS Forth] ''(англ.)'' |
| * См. слова [[Слово ↑|↑]] и [[2DUP]]
| |
| * Слово [http://forth.sourceforge.net/standard/dpans/dpans6.htm#6.1.0630 ?DUP (question-dupe)] в стандарте ANS Forth ''(англ.)''
| |
| * Слово [http://forth-standard.org/standard/core/qDUP ?DUP (question-dupe)] в черновике 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] ''(англ.)''
| |
|
| |
|
|
| |
|
Строка 124: |
Строка 8: |
| {{заготовка}} | | {{заготовка}} |
| [[Категория:Слова Каллисто]] | | [[Категория:Слова Каллисто]] |
| [[Категория:Примитивы]]
| |
| [[Категория:Стековые манипуляции Каллисто]] | | [[Категория:Стековые манипуляции Каллисто]] |
| [[Категория:Стандартные слова]]
| |
| [[Категория:1994 CORE]]
| |
| [[Категория:2012 CORE]]
| |