?DUP: различия между версиями

Материал из ПМК вики
Перейти к навигации Перейти к поиску
Строка 51: Строка 51:


: ?DUP    ( W->W,W|  0->0 )  DUP IF DUP THEN ;
: ?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>
</PRE>



Версия от 21:22, 27 марта 2016

?DUP (вопрос-дублировать, читается «вопрос-дуп») — стандартное слово Каллисто. Осуществляет операцию если x≠0.

?DUP           ( x -- 0 | x x )

Дублирует верхнее значение, если это не ноль, и оставляет стек в исходном состоянии, если на вершине ноль.

Ввод слова ?DUP

В режиме NUM последовательно нажмите клавиши  K     Р-ГРД-Г   K   3   6 

Для возврата в режим NUM нажмите синюю клавишу  P .

Детали реализации

Слово ?DUP часто используется перед IF.

?DUP в стандарте ANS Forth

6.1.0630   ?DUP                           "question-dupe"                  CORE
           ( x -- 0 | x x )
           Дублирует x, если оно ненулевое.

?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.

История

При переносе на Каллисто старых программ, написанных для fig-Форта, нужно заменять старое наименование −DUP на новое ?DUP

В Форте FSP88M это слово известно под именем ?DU (три литеры).

Слово ?DUP подвергается критике, т.к. оставляет на стеке разное количество элементов, что является плохим стилем программирования. В colorForth слово ?DUP нет, т.к. IF там неразрушающий.

Реализация

У Баранова-Ноздрунова приводится следующее определение слова ?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$

Ссылки


  У этой статьи нет иллюстраций. Вы можете помочь проекту, добавив их.


  Это заготовка статьи. Вы можете помочь проекту, дополнив её.