?DUP: различия между версиями
AtH (обсуждение | вклад) |
AtH (обсуждение | вклад) |
||
(не показаны 22 промежуточные версии этого же участника) | |||
Строка 1: | Строка 1: | ||
'''?DUP''' (вопрос-дублировать, читается «вопрос-дуп») — стандартное слово [[Каллисто]]. Осуществляет операцию [[Слово ↑|↑]] если x≠0. | '''?DUP''' (вопрос-дублировать, читается «вопрос-дуп») — стандартное слово [[Каллисто]]. Осуществляет операцию [[Слово ↑|↑]] если x≠0 (истина). | ||
?DUP ( x | ?DUP ( x −− 0 | x x ) Дублировать, если x<>0. | ||
Дублирует верхнее значение, если это не ноль, и оставляет [[Стек данных|стек]] в исходном состоянии, если на вершине ноль. | Дублирует верхнее значение, если это не ноль, и оставляет [[Стек данных|стек]] в исходном состоянии, если на вершине ноль. | ||
Строка 8: | Строка 7: | ||
Для возврата в [[режим NUM]] нажмите [[Клавиша P|синюю клавишу {{Синяя клавиша|P}}]]. | Для возврата в [[режим NUM]] нажмите [[Клавиша P|синюю клавишу {{Синяя клавиша|P}}]]. | ||
== ?DUP в стандарте ANS Forth == | == ?DUP в стандарте ANS Forth == | ||
Строка 17: | Строка 13: | ||
Дублирует x, если оно ненулевое. | Дублирует x, если оно ненулевое. | ||
== ?DUP в предыдущем стандарте Forth-83 (англ.) == | == История == | ||
При переносе на [[Каллисто]] старых программ, написанных для 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" | ?DUP 16b -- 16b 16b 79 "question-dupe" | ||
or 0 -- 0 | or 0 -- 0 | ||
Duplicate 16b if it is non-zero. | Duplicate 16b if it is non-zero. | ||
== ?DUP в стандарте Forth-79 (англ.) == | === ?DUP в стандарте Forth-79 (англ.) === | ||
?DUP n -- n ( n ) 184 "query-dupe" | ?DUP n -- n ( n ) 184 "query-dupe" | ||
Duplicate n if it is non-zero. | Duplicate n if it is non-zero. | ||
== −DUP в fig-FORTH Release 1 glossary, май 1979 (англ.) == | === −DUP в fig-FORTH Release 1 glossary, май 1979 (англ.) === | ||
-DUP n1 -- n1 (if zero) n1 -- n1 n1 (non-zero) L0 | -DUP n1 -- n1 (if zero) n1 -- n1 n1 (non-zero) L0 | ||
Reproduce n1 only if it is non-zero. | Reproduce n1 only if it is non-zero. | ||
Строка 32: | Строка 37: | ||
the need for an ELSE part to drop it. | the need for an ELSE part to drop it. | ||
== Реализация ?DUP == | == Реализация == | ||
У Баранова-Ноздрунова приводится следующее | <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 ( A ---> A,A / 0 ) ↑ IF ↑ THEN ; | ||
Описание и определение слова ?DUP в ядре ФОРТ-ЕС: | |||
<PRE> | <PRE> | ||
?DUP W->W,W ПРОДУБЛИРОВАТЬ W, ЕСЛИ ЭТО НЕ НУЛЬ 9 | |||
Экран номер 9 | Экран номер 9 | ||
( 31.03.86 DUP ?DUP DROP SWAP OVER >R R> R@ RDROP ROT ) | ( 31.03.86 DUP ?DUP DROP SWAP OVER >R R> R@ RDROP ROT ) | ||
Строка 43: | Строка 96: | ||
: ?DUP ( W->W,W| 0->0 ) DUP IF DUP THEN ; | : ?DUP ( W->W,W| 0->0 ) DUP IF DUP THEN ; | ||
</PRE> | </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}} | ||
* См. слова [[Слово ↑|↑]] и [[2DUP]] | |||
* Слово [http://forth.sourceforge.net/standard/dpans/dpans6.htm#6.1.0630 ?DUP (question-dupe)] в стандарте ANS Forth ''(англ.)'' | * Слово [http://forth.sourceforge.net/standard/dpans/dpans6.htm#6.1.0630 ?DUP (question-dupe)] в стандарте ANS Forth ''(англ.)'' | ||
* Слово [http:// | * Слово [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://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] ''(англ.)'' | * [http://www.forth.com/starting-forth/sf4/sf4.html Decisions, Decisions…] в книге [http://www.forth.com/starting-forth/ Leo Brodie Starting Forth] ''(англ.)'' | ||
Строка 64: | Строка 126: | ||
[[Категория:Примитивы]] | [[Категория:Примитивы]] | ||
[[Категория:Стековые манипуляции Каллисто]] | [[Категория:Стековые манипуляции Каллисто]] | ||
[[Категория: | [[Категория:Стандартные слова]] | ||
[[Категория:1994 CORE]] | |||
[[Категория:2012 CORE]] |
Текущая версия от 09:24, 19 февраля 2019
?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 (англ.)
У этой статьи нет иллюстраций. Вы можете помочь проекту, добавив их. |
Это заготовка статьи. Вы можете помочь проекту, дополнив её. |