Редактирование: ?DUP

Перейти к навигации Перейти к поиску
Внимание: Вы не вошли в систему. Ваш IP-адрес будет общедоступен, если вы запишете какие-либо изменения. Если вы войдёте или создадите учётную запись, её имя будет использоваться вместо IP-адреса, наряду с другими преимуществами.

Правка может быть отменена. Пожалуйста, просмотрите сравнение версий ниже, чтобы убедиться, что это нужная вам правка, и запишите страницу ниже, чтобы отменить правку.

Текущая версия Ваш текст
Строка 1: Строка 1:
'''?DUP''' (вопрос-дублировать, читается «вопрос-дуп») — стандартное слово [[Каллисто]]. Осуществляет операцию [[Слово ↑|↑]] если x≠0 (истина).
'''?DUP''' — стандартное слово [[Каллисто]].
?DUP          ( x −− 0 | x x )                    Дублировать, если x<>0.
Дублирует верхнее значение, если это не ноль, и оставляет [[Стек данных|стек]] в исходном состоянии, если на вершине ноль.
 
== Ввод слова ?DUP ==
В [[Режим NUM|режиме NUM]] последовательно нажмите клавиши [[Клавиша K|{{Синяя клавиша|K}}]] &nbsp; [[Клавиша Р-ГРД-Г|{{Чёрная клавиша|Р-ГРД-Г}}]] [[Клавиша 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&ne;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]]
Пожалуйста, учтите, что любой ваш вклад в проект «ПМК вики» может быть отредактирован или удалён другими участниками. Если вы не хотите, чтобы кто-либо изменял ваши тексты, не помещайте их сюда.
Вы также подтверждаете, что являетесь автором вносимых дополнений, или скопировали их из источника, допускающего свободное распространение и изменение своего содержимого (см. Pmkwiki:Авторские права). НЕ РАЗМЕЩАЙТЕ БЕЗ РАЗРЕШЕНИЯ ОХРАНЯЕМЫЕ АВТОРСКИМ ПРАВОМ МАТЕРИАЛЫ!

В целях защиты вики от автоматического спама в правках просим вас решить следующую каптчу:

Отменить Справка по редактированию (в новом окне)