Forth
http://www.fforum.winglion.ru/

циклы NOW .. SINCE .. TILL (расширенный вариант FOR NEXT)
http://www.fforum.winglion.ru/viewtopic.php?f=25&t=1161
Страница 1 из 1

Автор:  mOleg [ Пн фев 11, 2008 03:17 ]
Заголовок сообщения:  циклы NOW .. SINCE .. TILL (расширенный вариант FOR NEXT)

надумалось немного расширить возможности циклов 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


Страница 1 из 1 Часовой пояс: UTC + 3 часа [ Летнее время ]
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/