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

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

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

Текущая версия Ваш текст
Строка 18: Строка 18:
В Форте FSP88M это слово известно под именем ?DU (три литеры).
В Форте FSP88M это слово известно под именем ?DU (три литеры).


Слово ?DUP подвергается критике, т.к. оставляет на [[Стек данных|стеке]] разное количество элементов, что является плохим стилем программирования. Чаще всего ?DUP используется для компенсации того, что [[IF]] снимает со [[Стек данных|стека]] свой аргумент.
Слово ?DUP подвергается критике, т.к. оставляет на [[Стек данных|стеке]] разное количество элементов, что является плохим стилем программирования. Чаще всего ?DUP используется для компенсации того, что [[IF]] снимает со [[Стек данных|стека]] свой аргумент. В {{colorForth}} слово ?DUP нет, т.к. [[IF]] там неразрушающий.
 
В {{colorForth}} слово ?DUP нет, т.к. [[IF]] там неразрушающий. В cf2019 слово ?DUP используется для оптимизации макросов и аналогично [[DUP]] за одним исключением — будучи использованным после [[DROP]] , вместо компиляции [[DUP]] «отменяет» компиляцию этого [[DROP]] .


=== ?DUP в предыдущем стандарте Forth-83 (англ.) ===
=== ?DUP в предыдущем стандарте Forth-83 (англ.) ===
Строка 47: Строка 45:
1916 JQDUP:          PKRM03  KX!=09                  ; Если x<>0
1916 JQDUP:          PKRM03  KX!=09                  ; Если x<>0
1917                KM3  KGOTO9                    ; ..делает DUP
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>
</pre>


Пожалуйста, учтите, что любой ваш вклад в проект «ПМК вики» может быть отредактирован или удалён другими участниками. Если вы не хотите, чтобы кто-либо изменял ваши тексты, не помещайте их сюда.
Вы также подтверждаете, что являетесь автором вносимых дополнений, или скопировали их из источника, допускающего свободное распространение и изменение своего содержимого (см. Pmkwiki:Авторские права). НЕ РАЗМЕЩАЙТЕ БЕЗ РАЗРЕШЕНИЯ ОХРАНЯЕМЫЕ АВТОРСКИМ ПРАВОМ МАТЕРИАЛЫ!

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

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