ну, вот и до постскрипта добрался :)\
имена взяты не оригинальные (из-за колизий) на сколько удачны придуманные мною не знаю.
<pre>
\ 09.05.2009 ~mOleg
\ Сopyright [C] 2009 mOleg
mininoleg@yahoo.com
\ Postscript - подобные конструкции управления
\ в зависимости от значения flag выполнить либо xta либо xtb
: IfElse ( flag xta xtb --> ) ROT IF NIP ELSE DROP THEN EXECUTE ;
\ выполнять бесконечное количество раз xt
: infinite ( xt --> ) A>R BEGIN AR@ EXECUTE AGAIN ;
\ выполнять xt указанное количество раз #
: cycle ( # xt --> )
A>R
>R BEGIN R> *WHILE
>L AR@ L> 1 - >R EXECUTE
REPEAT
DROP ARDROP ;
?ABSENT test{ \EOF -- тестовая секция ---------------------------------------
test{ :> sma 3 * ;
2 3 sma cycle 54 <> THROW
:> smb 1 - *IF ;THEN ARDROP ARDROP ;
10 smb infinite THROW
:> smc 123412 ;
:> smd 509485 ;
0 smc smd IfElse smc EXECUTE <> THROW
112 smc smd IfElse smd EXECUTE <> THROW
-1 smc smd IfElse smd EXECUTE <> THROW
}test
</pre>
не сделал только аналог Фортового DO +LOOP , уж больно он муторный (думаю как сделать попроще).
что интересно, cycle усложнен ради переносимости. Учтен вариант, когда адреса и данные имеют разную разрядность, правда без локального стека не обошлось.
Ну, и по большому счтету, все такие конструкции желательно реализовывать на ассемблере, так как они очень сильно завязаны на устройство реальной машины с одной стороны, а с другой должны исполняться как можно быстрее.