?DUP

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

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

Ссылки[править]


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


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