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

Материал из ПМК вики
Перейти к навигации Перейти к поиску
Нет описания правки
Строка 78: Строка 78:
[[Категория:Примитивы]]
[[Категория:Примитивы]]
[[Категория:Стековые манипуляции Каллисто]]
[[Категория:Стековые манипуляции Каллисто]]
[[Категория:Стандартные слова]]
[[Категория:1994 CORE]]

Версия от 14:44, 25 июня 2016

?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 там неразрушающий.

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

Реализация

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

Ссылки


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


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