надумалось немного расширить возможности циклов FOR NEXT.
пример:
Код:
\ найти сумму чисел a .. z количеством #
: summa ( [ a .. z ] # --> d ) 1 - NOW S>D SINCE ROT S>D D+ TILL ;
10 20 30 40 4 summa D.
NOW копирует счетчик цикла на стек возвратов
далее идет подготовка к выполнению цикла
SINCE отмечает место начала цикла
далее тело цикла
TILL (или NEXT) проверяет условие, если необходимо возвращает управление на метку SINCE
Код:
\ 02-06-2007 ~mOleg
\ Copyright [C] 2007 mOleg mininoleg@yahoo.com
\ реализация циклов FOR NEXT для СПФ (Версия для fork-а)
\ начать цикл NOW .. SINCE .. TILL\NEXT
: NOW ( u --> ) ?init: 3 controls +! COMPILE >R ; IMMEDIATE
\ метка для перехода назад
: SINCE ( --> ) <MARK ; IMMEDIATE
\ начать определения цикла со счетчиком
: FOR ( n --> ) [COMPILE] NOW [COMPILE] SINCE ; IMMEDIATE
\ если счетчик цикла не равен нулю перейти к точке, отмеченной словом FOR
\ иначе удалить счетчик цикла, и выйти из цикла.
: NEXT ( --> )
?COMP -3 controls +!
COMPILE R@ -1 LIT, COMPILE R+ N?BRANCH, COMPILE RDROP
controls @ IFNOT [COMPILE] ;stop THEN ; IMMEDIATE
\ аналогично NEXT позволяет создавать циклы со счетчиком,
\ только счет ведется до достижения 1, а не 0
: TILL ( --> )
?COMP -3 controls +!
-1 LIT, COMPILE R+ COMPILE R@ N?BRANCH, COMPILE RDROP
controls @ IFNOT [COMPILE] ;stop THEN ; IMMEDIATE
\EOF
пример использования:
10 FOR R@ . NEXT ╜ должен выдать ряд чисел от 10 до 0
10 FOR R@ . TILL ╜ должен выдать ряд чисел от 10 до 1
использование данных конструкций возможно в режиме исполнения
то есть, пример приведенный выше может быть набран прямо в ком. строке
дополнительные варианты:
NOW ... SINCE ... TILL
NOW ... SINCE ... NEXT