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

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

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

Текущая версия Ваш текст
Строка 1: Строка 1:
'''?DUP''' (вопрос-дублировать, читается «вопрос-дуп») — стандартное слово [[Каллисто]]. Осуществляет операцию [[Слово ↑|↑]] если x≠0 (истина).
'''?DUP''' (вопрос-дублировать, читается «вопрос-дуп») — стандартное слово [[Каллисто]]. Осуществляет операцию [[Слово ↑|↑]] если x≠0.
  ?DUP          ( x −− 0 | x x )                     Дублировать, если x<>0.
  ?DUP          ( x -- 0 | x x )
 
Дублирует верхнее значение, если это не ноль, и оставляет [[Стек данных|стек]] в исходном состоянии, если на вершине ноль.
Дублирует верхнее значение, если это не ноль, и оставляет [[Стек данных|стек]] в исходном состоянии, если на вершине ноль.


Строка 7: Строка 8:


Для возврата в [[режим NUM]] нажмите [[Клавиша P|синюю клавишу {{Синяя клавиша|P}}]].
Для возврата в [[режим NUM]] нажмите [[Клавиша P|синюю клавишу {{Синяя клавиша|P}}]].
== Детали реализации ==
Слово ?DUP часто используется перед [[IF]].


== ?DUP в стандарте ANS Forth ==
== ?DUP в стандарте ANS Forth ==
Строка 13: Строка 17:
             Дублирует 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.
Строка 37: Строка 32:
         the need for an ELSE part to drop it.
         the need for an ELSE part to drop it.


== Реализация ==
== Реализация ?DUP ==
<pre>
У Баранова-Ноздрунова приводится следующее описание слова ?DUP (стр. 29):
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  ( A ---> A,A / 0 )    ↑ IF ↑ THEN ;


Описание и определение слова ?DUP в ядре ФОРТ-ЕС:
Определение слова ?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 )
Строка 96: Строка 43:
: ?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
При переносе на [[Каллисто]] старых программ, написанных для fig-Форта, нужно заменять старое наименование −DUP на новое ?DUP
            NEXT
 
В Форте FSP88M это слово известно под именем ?DU


            HEAD    204Q,'-DU',320Q,DDUP                ; -DUP
Слово ?DUP подвергается критике, т.к. оставляет на стеке разное количество элементов, что является плохим стилем программирования. В {{colorForth}} слово ?DUP нет, т.к. IF там неразрушающий.
            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://forth-standard.org/standard/core/qDUP ?DUP (question-dupe)] в черновике Forth 200x ''(англ.)''
* Слово [http://www.forth200x.org/documents/html3/core/qDUP.html ?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] ''(англ.)''
Строка 126: Строка 64:
[[Категория:Примитивы]]
[[Категория:Примитивы]]
[[Категория:Стековые манипуляции Каллисто]]
[[Категория:Стековые манипуляции Каллисто]]
[[Категория:Стандартные слова]]
[[Категория:Описание бета-версии Каллисто]]
[[Категория:1994 CORE]]
[[Категория:2012 CORE]]
Пожалуйста, учтите, что любой ваш вклад в проект «ПМК вики» может быть отредактирован или удалён другими участниками. Если вы не хотите, чтобы кто-либо изменял ваши тексты, не помещайте их сюда.
Вы также подтверждаете, что являетесь автором вносимых дополнений, или скопировали их из источника, допускающего свободное распространение и изменение своего содержимого (см. Pmkwiki:Авторские права). НЕ РАЗМЕЩАЙТЕ БЕЗ РАЗРЕШЕНИЯ ОХРАНЯЕМЫЕ АВТОРСКИМ ПРАВОМ МАТЕРИАЛЫ!

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

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