PICK: различия между версиями
AtH (обсуждение | вклад) Нет описания правки |
AtH (обсуждение | вклад) |
||
(не показано 16 промежуточных версий этого же участника) | |||
Строка 1: | Строка 1: | ||
'''PICK''' (взять, читается «пик») — стандартное слово [[Каллисто]]. Продублировать u-ное сверху значение. | '''PICK''' (взять, читается «пик») — стандартное слово [[Каллисто]]. Продублировать u-ное сверху значение. | ||
[[Файл:dSDepthPickRot.png|thumb|right|264px|Пример работы слова PICK]] | |||
PICK ( xu ... x1 x0 u -- xu ... x1 x0 xu ) Дублировать u-ное сверху. | PICK ( xu ... x1 x0 u -- xu ... x1 x0 xu ) Дублировать u-ное сверху. | ||
Удаляет u. Копирует элемент [[Стек данных|стека]] с номером u (считая от нуля, само число u при этом не считается) и записывает его наверх [[Стек данных|стека]]. | Удаляет u. Копирует элемент [[Стек данных|стека]] с номером u (считая от нуля, само число u при этом не считается) и записывает его наверх [[Стек данных|стека]]. | ||
Строка 5: | Строка 6: | ||
== Ввод слова PICK == | == Ввод слова PICK == | ||
В [[Режим ЛАТ|режиме ЛАТ]] последовательно нажмите четыре клавиши [[Клавиша 6|{{Серая клавиша|6}}]] [[Клавиша 7|{{Серая клавиша|7}}]] [[Клавиша С/П|{{Чёрная клавиша|С/П}}]] [[Клавиша 9|{{Серая клавиша|9}}]] | В [[Режим ЛАТ|режиме ЛАТ]] последовательно нажмите четыре клавиши [[Клавиша 6|{{Серая клавиша|6}}]] [[Клавиша 7|{{Серая клавиша|7}}]] [[Клавиша С/П|{{Чёрная клавиша|С/П}}]] [[Клавиша 9|{{Серая клавиша|9}}]] | ||
== PICK в стандарте ANS Forth == | == PICK в стандарте ANS Forth == | ||
<PRE> | |||
6.2.2030 PICK CORE EXT | 6.2.2030 PICK CORE EXT | ||
( xu ... x1 x0 u -- xu ... x1 x0 xu ) | ( xu ... x1 x0 u -- xu ... x1 x0 xu ) | ||
Строка 17: | Строка 16: | ||
A.6.2.2030 PICK | A.6.2.2030 PICK | ||
0 PICK эквивалентно DUP, и 1 PICK эквивалентно OVER. | 0 PICK эквивалентно DUP, и 1 PICK эквивалентно OVER. | ||
</PRE> | |||
== PICK в предыдущем стандарте Forth-83 (англ.) == | == История == | ||
В Форте-83 действие слова PICK подверглось кардинальному изменению. Следуя стандарту Форт−83 (и последующим) отсчёт начинается сверху и верхний элемент имеет номер 0, то есть 0 PICK это [[Слово ↑|↑]] | |||
В [[Каллисто]] слово PICK совместимо с версией Форта-83 и последующими. В программах, написанных для Форта-79 и более ранних версий, слово PICK надо заменять на последовательность [[1−]] PICK | |||
=== PICK в предыдущем стандарте Forth-83 (англ.) === | |||
PICK +n -- 16b 83 | PICK +n -- 16b 83 | ||
16b is a copy of the +nth stack value, not counting +n | 16b is a copy of the +nth stack value, not counting +n | ||
Строка 25: | Строка 30: | ||
1 PICK is equivalent to OVER | 1 PICK is equivalent to OVER | ||
== PICK в стандарте Forth-79 (англ.) == | === PICK в стандарте Forth-79 (англ.) === | ||
PICK n1 -- n2 240 | PICK n1 -- n2 240 | ||
Return the contents of the n1-th stack value, not counting n1 | Return the contents of the n1-th stack value, not counting n1 | ||
Строка 31: | Строка 36: | ||
2 PICK is equivalent to OVER. {1..n} | 2 PICK is equivalent to OVER. {1..n} | ||
== | == Реализация == | ||
Верхний элемент стека имеет номер нуль, так что 0 PICK равносильно [[Слово ↑|↑]], а 1 PICK равносильно [[OVER]]. | |||
<pre> | |||
1862 ; ∗∗ Операции со стеком параметров ∗∗ | |||
1863 ; | |||
1864 ;#PICK | |||
1865 ; PICK ( xu .. x1 x0 u −− xu .. x1 x0 xu ) Дублировать u−ное сверху. | |||
1866 LPICK: .DB 4 | |||
1867 .TEXT "PICK" | |||
1868 .DW LLEV | |||
1869 PICK: .DW JPICK ; Копирует элемент стека с номером u и записывает его наверх стека, 0 PICK это DUP | |||
1870 JPICK: PKRM03 KX>=09 ; Проверить на неверное значение | |||
1871 RM3 + M5 KRM5 PKM03 ; Косвенная адресация с R5 использует прединкремент | |||
1872 KGOTO9 | |||
</pre> | |||
=== Реализация в SP-Forth 4.20 === | |||
<pre> | |||
CODE PICK ( xu ... x1 x0 u -- xu ... x1 x0 xu ) \ 94 CORE EXT | |||
\ Убрать u. Копировать xu на вершину стека. Неопределенная ситуация | |||
\ возникает, если перед выполнением PICK на стеке меньше, | |||
\ чем u+2 элементов. | |||
MOV EAX, [EBP] [EAX*4] | |||
RET | |||
END-CODE | |||
</pre> | |||
== | === Советская реализация === | ||
Слово PICK в ФОРТ-ЕС было [[примитив]]ом. Вот его описание и определение: | Слово PICK в ФОРТ-ЕС было [[примитив]]ом. Вот его описание и определение: | ||
<PRE> | <PRE> | ||
Строка 70: | Строка 97: | ||
{{заготовка}} | {{заготовка}} | ||
[[Категория:Слова Каллисто]] | [[Категория:Слова Каллисто]] | ||
[[Категория:Примитивы]] | [[Категория:Примитивы]] | ||
[[Категория:Стековые манипуляции Каллисто]] | [[Категория:Стековые манипуляции Каллисто]] | ||
[[Категория: | [[Категория:Стандартные слова]] | ||
[[Категория:1994 CORE EXT]] | |||
[[Категория:2012 CORE EXT]] |
Текущая версия от 09:25, 19 февраля 2019
PICK (взять, читается «пик») — стандартное слово Каллисто. Продублировать u-ное сверху значение.
PICK ( xu ... x1 x0 u -- xu ... x1 x0 xu ) Дублировать u-ное сверху.
Удаляет u. Копирует элемент стека с номером u (считая от нуля, само число u при этом не считается) и записывает его наверх стека.
Ввод слова PICK[править]
В режиме ЛАТ последовательно нажмите четыре клавиши 6 7 С/П 9
PICK в стандарте ANS Forth[править]
6.2.2030 PICK CORE EXT ( xu ... x1 x0 u -- xu ... x1 x0 xu ) Удаляет u. Копирует xu на вершину стека. Неопределенная ситуация существует, если до выполнения PICK на стеке меньше u+2 элементов. A.6.2.2030 PICK 0 PICK эквивалентно DUP, и 1 PICK эквивалентно OVER.
История[править]
В Форте-83 действие слова PICK подверглось кардинальному изменению. Следуя стандарту Форт−83 (и последующим) отсчёт начинается сверху и верхний элемент имеет номер 0, то есть 0 PICK это ↑
В Каллисто слово PICK совместимо с версией Форта-83 и последующими. В программах, написанных для Форта-79 и более ранних версий, слово PICK надо заменять на последовательность 1− PICK
PICK в предыдущем стандарте Forth-83 (англ.)[править]
PICK +n -- 16b 83 16b is a copy of the +nth stack value, not counting +n itself. {0..the number of elements on stack-1} 0 PICK is equivalent to DUP 1 PICK is equivalent to OVER
PICK в стандарте Forth-79 (англ.)[править]
PICK n1 -- n2 240 Return the contents of the n1-th stack value, not counting n1 itself. An error condition results for n less than one. 2 PICK is equivalent to OVER. {1..n}
Реализация[править]
Верхний элемент стека имеет номер нуль, так что 0 PICK равносильно ↑, а 1 PICK равносильно OVER.
1862 ; ∗∗ Операции со стеком параметров ∗∗ 1863 ; 1864 ;#PICK 1865 ; PICK ( xu .. x1 x0 u −− xu .. x1 x0 xu ) Дублировать u−ное сверху. 1866 LPICK: .DB 4 1867 .TEXT "PICK" 1868 .DW LLEV 1869 PICK: .DW JPICK ; Копирует элемент стека с номером u и записывает его наверх стека, 0 PICK это DUP 1870 JPICK: PKRM03 KX>=09 ; Проверить на неверное значение 1871 RM3 + M5 KRM5 PKM03 ; Косвенная адресация с R5 использует прединкремент 1872 KGOTO9
Реализация в SP-Forth 4.20[править]
CODE PICK ( xu ... x1 x0 u -- xu ... x1 x0 xu ) \ 94 CORE EXT \ Убрать u. Копировать xu на вершину стека. Неопределенная ситуация \ возникает, если перед выполнением PICK на стеке меньше, \ чем u+2 элементов. MOV EAX, [EBP] [EAX*4] RET END-CODE
Советская реализация[править]
Слово PICK в ФОРТ-ЕС было примитивом. Вот его описание и определение:
PICK WN,..,,W0,+N->WN,...,W0,WN ПРОДУБЛИРОВАТЬ 12 N-E СВЕРХУ ЗНАЧЕНИЕ Экран номер 12 ( 31.03.86 ROLL PICK 2DUP 2DROP 2SWAP 2OVER 2ROT ) CODE PICK ( WN,,..,W0,+N->WN,...,W0,WN) RW2 PULL, RW2 RW2 AR, ERCONDB BM, RW1 2 (, RW2 RSTACK LH, PUTRW1 B, END-CODE
В FORTH ИТЭФ слово PICK также было примитивом, вот его определение:
** Операции со стеком параметров ** HEAD 204Q,'PIC',313Q,PICK ; PICK POP BX CMP BX, 0 JLE $GO DEC BX SAL BX, 1 ADD BX, SP PUSH SS:[BX] $GO: NEXT
Ссылки[править]
- Исходный текст слова PICK в Каллисто Классик 1.0
- Слово PICK и комментарий к нему в стандарте ANS Forth (англ.)
- Слово PICK и комментарий к нему в черновике Forth 200x (англ.)
Это заготовка статьи. Вы можете помочь проекту, дополнив её. |