ROT

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

ROT (вращать, читается «роут») — стандартное слово Каллисто. Перенести третий сверху элемент стека наверх стека.

Пример работы слова ROT
ROT            ( z y x -- y x z )              Перенести наверх третье сверху.

Циклически переставляет три верхних элемента стека, перенося самый нижний из них наверх стека.

Ввод слова ROT[править]

В режиме ЛАТ последовательно нажмите три белые клавиши  ×   5   2 

ROT и FROT в стандарте ANS Forth[править]

 6.1.2160   ROT                                 "rote"                      CORE
            ( x1 x2 x3 -- x2 x3 x1 )
            Вращает три верхних элемента стека.

 12.6.1.1610   FROT                      "f-rote"                       FLOATING
            ( F: r1 r2 r3 -- r2 r3 r1 ) or ( r1 r2 r3 -- r2 r3 r1 )
            Вращает три верхних элемента стека с плавающей точкой.

Заметки[править]

Слово, обратное ROT, называется −ROT . Его нет в ядре Каллисто, но −ROT легко выразить через ROT:

: -ROT  ( z y x -- x z y)   ROT ROT ;

История[править]

В Форте слово ROT одно из самых древних и устоявшихся. Название слова ROT происходит от английского rotate — вращать.

Произношение «роут» взято из второй главы книги Лео Броуди «Starting Forth». Лео настаивает на том, чтобы английская буква "o" произносилась так, как в английском алфавите (открытом слове). Также это помогает отличать каллистянское слово ROT от русского слова «рот» (уста, зев, пасть).

В документации ФОРТ-ЕС подобное кольцевое передвижение элементов стека, когда самый нижний элемент «всплывает» наверх, названо «по часовой стрелке». Эта шутка противоречит рисунку на клавиатуре ПМК, где команда F⟳ «топит» верхний элемент (регистр X) 4-х уровненного стека на его дно (регистр T), дублируя действия DROP.

ROT в предыдущем стандарте Forth-83 (англ.)[править]

     ROT          16b1 16b2 16b3 -- 16b2 16b3 16b1  79          "rote"
          The top three stack entries are rotated, bringing the
          deepest to the top.

ROT в стандарте Forth-79 (англ.)[править]

ROT            n1 n2 n3 -- n2 n3 n1          212             "rote"
    Rotate the top three values, bringing the deepest to the top.

ROT в fig-FORTH Release 1 glossary, май 1979 (англ.)[править]

ROT            n1 n2 n3 --- n2 n3 n1         L0
       Rotate the top three values on the stack, bringing the third to the
       top.

Реализация[править]

1926 ;#ROT
1927 ; ROT              ( z y x −− y x z )                   Вращать. Перенести наверх третий сверху.
1928 LROT:           .DB     3
1929                 .TEXT   "ROT"                   ; ( a b c −− b c a )
1930                 .DW     LDUP2
1931 ROT:            .DW     JROT                    ; Перенести 3−й элемент стека наверх. ("Вращение трёх верхних элементов по часовой стрелке.")
1932 JROT:           RM3 M8 M5
1933                 KRM5 KRM8 PKM05 <−>
1934                 KRM5 KM8 <−>
1935                 PKM05
1936                 KGOTO9
1937 ; x1 x2 x3 −− a b c = x2 x3 x1
1938 ;
1939 ; T |
1940 ; Z |                         x3   x3    x3    x3
1941 ; Y |        x2   x2     x3   x2   x2    x1    x1
1942 ; X |  x2    x3  b:=x3   x2   x1  c:=x1  x2   a:=x2
1943 ; −−+−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
1944 ;     KRM5  KRM8 PKM05  <−>  KRM5  KM8   <−>  PKM05

Следующий вариант реализации использует на один регистр и одну команду меньше, зато длиннее на один шаг. Если он окажется быстрее, реализацию ROT можно заменить на следующую:

CODE ROT  ( z y x -- y x z )  ИП3 П5  КИП5 РКИП03  РКП05  ↔  КИП5 РКП03 ↔  РКП05  КБП9  END-CODE

Реализации из SP-Forth 4.20:

CODE ROT ( x1 x2 x3 -- x2 x3 x1 ) \ 94
\ Прокрутить три верхних элемента стека.
     MOV  EDX, [EBP]
     MOV  [EBP], EAX
     MOV  EAX, 4 [EBP]
     MOV  4 [EBP], EDX
     RET
END-CODE
CODE FROT \ *
       FXCH  ST(2)
       FXCH  ST(1)
       FXCH  ST(2)
       FXCH  ST(1)
       RET
END-CODE

Советская реализация[править]

Определение слова ROT в ядре ФОРТ-ЕС использует стек возвратов:

ROT          W1,W2,W3->W2,W3,W1 ПЕРЕСТАВИТЬ ТРИ                  9
             ВЕРХНИХ ЗНАЧЕНИЯ ПО ЧАСОВОЙ СТРЕЛКЕ

                      Экран номер 9
( 31.03.86   DUP ?DUP DROP SWAP OVER >R R> R@ RDROP ROT )

: ROT   ( N1,N2,N3->N2,N3,N1 )    >R SWAP R> SWAP ;

В FORTH ИТЭФ слово ROT было примитивом, вот его определение:

            HEAD     203Q,'RO',324Q,ROT                   ; ROT
            POP  AX
            POP  CX
            POP  BX
            PUSH CX
            PUSH AX
            PUSH BX
            NEXT

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


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