Forth и другие саморасширяющиеся системы программирования Locations of visitors to this page
Текущее время: Чт мар 28, 2024 18:27

...
Google Search
Forth-FAQ Spy Grafic

Часовой пояс: UTC + 3 часа [ Летнее время ]




Начать новую тему Ответить на тему  [ 1 сообщение ] 
Автор Сообщение
 Заголовок сообщения: циклы NOW .. SINCE .. TILL (расширенный вариант FOR NEXT)
СообщениеДобавлено: Пн фев 11, 2008 03:17 
Не в сети
Moderator
Moderator
Аватара пользователя

Зарегистрирован: Чт май 04, 2006 00:53
Сообщения: 5062
Откуда: был Крым, теперь Новосибирск
Благодарил (а): 23 раз.
Поблагодарили: 63 раз.
надумалось немного расширить возможности циклов 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


_________________
Мне бы только мой крошечный вклад внести,
За короткую жизнь сплести
Хотя бы ниточку шёлка.
fleur


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ 1 сообщение ] 

Часовой пояс: UTC + 3 часа [ Летнее время ]


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 40


Вы не можете начинать темы
Вы можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

cron
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
phpBB сборка от FladeX // Русская поддержка phpBB