Попробую показать кодогенератор CF, используя синтаксит CLCF - так больше похоже на обычный Форт.
впереди слов есть просто пометки
+ отмечено, что слово реализовано у меня в компиляторе
- - слово не реализовано, потому что не применяется.
if неразрушающий и использует флаги проца
', компилирует следующий за ним макрос
1, 2, 3, 4, компилируют столько-то байт из числа на стеке
Это для затравки.
Для понимания надо добавить описание еще нескольких слов. Сделаю это чуть позже...
Код был получен обработкой текста экранов одной из реализации CF.
Код:
macro
\ другое : swap 16B8 2, C28B0689 4, ;
+ : 0 ', ?dup C031 2, ;
+ : if 74 2, here ;
+ : -if 79 2, here ;
+ : a ', ?dup C28B 2, ;
+ : a! ?lit if BA 1, , ; then D08B 2, ', drop ;
+ : 2* E0D1 2, ;
- : a, 2* 2* , ; \ переделать!!
+ : @ ?lit if ', ?dup 58B 2, ', a, ; then 85048B 3, 0 , ; \ !!
+ : ! ?lit if ?lit if 5C7 2, swap ', a, , ; then
589 2, ', a, ', drop ; then
', a! 950489 3, 0 , ', drop ;
+ : nip 4768D 3, ;
+ : + ?lit if 5 1, , ; then 603 2, ', nip ;
+ : or 633
+ : binary ?lit if swap 2 + 1, , ; then 2, ', nip ;
+ : and 623 ', binary ;
+ : u+ ?lit if 681 2, , ; then 44601 3, ', drop ;
\ : ? ?lit A9 1, , ; \ проверить, что это такое
+ : over ', ?dup 4468B 3, ;
+ : push 50 1, ', drop ;
+ : pop ', ?dup 58 1, ;
+ : - D0F7 2, ;
: for ', push ', begin ;
: *next swap
: next 75240CFF
: 0next , here - + 1, 4C483 3, ;
: -next 79240CFF ', 0next ;
: i ', ?dup 24048B 3, ;
: *end swap
: end EB 1, here - + 1, ;
: +! ?lit if ?lit if 581 2, swap ', a, , ; then
501 2, ', a, ', drop ; then
', a! 950401 3, 0 , ', drop ;
+ : nop 90 1, ;
+ : align here - 3 and drop if ', nop ', align ; then ;
- : or! ', a! 950409 3, 0 , ', drop ;
+ : * 6AF0F 3, ', nip ;
+ : */ C88B 2, ', drop F9F72EF7 , ', nip ;
+ : /mod ', swap 99 1, 16893EF7 , ;
+ : / ', /mod ', nip ;
+ : mod ', /mod ', drop ;
\ compiled macros
+ : 2/ F8D1 2, ;
: time ', ?dup 310F 2, ; \ только для Pentium :(
forth
+ : @ @ ;
+ : ! ! ;
+ : + + ;
+ : */ */ ;
+ : * * ;
+ : / / ;
+ : 2/ 2/ ;
+ : dup dup ;
\ Arithmetic
: negate - 1 + ; \ проверить
: min less if drop ; then swap drop ;
: abs dup negate
: max less if swap then drop ;
\ дополнения -ИН
: v+ ( vv-v ) push u+ pop + ;
- : writes ( acn ) for write next drop drop ;
- : reads ( acn ) for read next drop drop ;
- : oadf ( qwerty )
- : save 0 dup [ nc ], @ writes stop ;