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

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

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

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


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


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


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


== Реализация ==
== История ==
<pre>
При переносе на [[Каллисто]] старых программ, написанных для fig-Форта, нужно заменять старое наименование −DUP на новое ?DUP
1910 ;#qDUP
 
1911 ; ?DUP            ( x −− 0 | x x )                     Дублировать, если x&ne;0.
В Форте FSP88M это слово известно под именем ?DU (три литеры).
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 ===
Слово ?DUP подвергается критике, т.к. оставляет на стеке разное количество элементов, что является плохим стилем программирования. Чаще всего ?DUP используется для компенсации того, что [[IF]] снимает со [[Стек данных|стека]] свой аргумент. В {{colorForth}} слово ?DUP нет, т.к. [[IF]] там неразрушающий.
<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 (стр. 29):
   : ?DUP  ( A ---> A,A / 0 )    ↑ IF ↑ THEN ;
   : ?DUP  ( A ---> A,A / 0 )    ↑ IF ↑ THEN ;
Строка 126: Строка 81:
[[Категория:Примитивы]]
[[Категория:Примитивы]]
[[Категория:Стековые манипуляции Каллисто]]
[[Категория:Стековые манипуляции Каллисто]]
[[Категория:Стандартные слова]]
[[Категория:1994 CORE]]
[[Категория:2012 CORE]]
Пожалуйста, учтите, что любой ваш вклад в проект «ПМК вики» может быть отредактирован или удалён другими участниками. Если вы не хотите, чтобы кто-либо изменял ваши тексты, не помещайте их сюда.
Вы также подтверждаете, что являетесь автором вносимых дополнений, или скопировали их из источника, допускающего свободное распространение и изменение своего содержимого (см. Pmkwiki:Авторские права). НЕ РАЗМЕЩАЙТЕ БЕЗ РАЗРЕШЕНИЯ ОХРАНЯЕМЫЕ АВТОРСКИМ ПРАВОМ МАТЕРИАЛЫ!

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

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