Forth и другие саморасширяющиеся системы программирования Locations of visitors to this page
Текущее время: Ср ноя 21, 2018 14:12

...
Google Search
Forth-FAQ Spy Grafic

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




Начать новую тему Ответить на тему  [ Сообщений: 3 ] 
Автор Сообщение
 Заголовок сообщения: Уголок бектрекинга
СообщениеДобавлено: Вс авг 12, 2018 11:59 
Не в сети

Зарегистрирован: Чт янв 07, 2016 19:14
Сообщения: 655
Благодарил (а): 0 раз.
Поблагодарили: 6 раз.
Находим факториал в 2 строчки:
Код:
REQUIRE LOOP ~ER/DOLOOP.F
REQUIRE PRO ~ER/BTC/L-STACK.F

: 0->N PRO 0 DO I CONT LOOP ; \ n -- iter: 0|1|2|etc|n-1
: FACT 1 SWAP 0->N 1+ * ;   \ n -- n!

_________________
Цель: сделать 64-битную Нову под Винду


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Уголок бектрекинга
СообщениеДобавлено: Сб ноя 17, 2018 17:03 
Не в сети

Зарегистрирован: Чт янв 07, 2016 19:14
Сообщения: 655
Благодарил (а): 0 раз.
Поблагодарили: 6 раз.
Памятка по откатным техникам.

Используемые понятия:
Итератор - функция, при вызове которой код идущий после этого вызова фактически является каллбеком (callback) этой функции.
Отсечение - операция удаляющая всё на стеке возвратов вплоть до достижения метки.
Код:

RP@ .... iter1: ... iter2: ... RP!

Поставить на откат - функция действующая на обратном ходу (при выходе из слова, при EXIT и пр.)

Рекомендации:
Перед началом кода итератора желательно нужно просчитать возможное изменение данных на стеке. Если этого не делать, то можно получить на выходе некорректные данные и/или сложно обнаруживаемые баги.
Поскольку стеки могут изменяться, как на прямом, так и на обратном ходу, это очень важно.
Поэтому, если в итератор передаются не только требуемые ему значения, то дополнительные параметры нужно поставить на откат.

Один из фрагментов рабочего кода:
Код:
RP@  \ это дополнительное значение для итератора
['] FALSE >R  \ если итератор не дал результатов, то укладываем на стек данных 0
['] DROP >R   \ а это наш "нормализатор". Уберёт на обратном ходу доп. значение ( RP@ ) со стека данных
....  \ тут уже итератор и нужные ему параметры


Отсечение это безповоротный выход из итераторов в т. ч. и вложенных. Вместо того, чтобы распутывать каждый итератор как верёвочку, мы рубим часть стека возвратов, как Македонский гордиев узел. Просто, изящно, эффективно, быстро.
Разумеется, если итератор будет хранить служебные данные в хипе и пр., то отсечение не лучший выход. Ещё память отлавливать.
Отсечение (cut) применяется когда перебор уже не имеет смысла (нашли нужный результат и пр.)

_________________
Цель: сделать 64-битную Нову под Винду


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Уголок бектрекинга
СообщениеДобавлено: Вт ноя 20, 2018 15:35 
Не в сети

Зарегистрирован: Чт янв 07, 2016 19:14
Сообщения: 655
Благодарил (а): 0 раз.
Поблагодарили: 6 раз.
Из каллбекового слова в итератор и обратно
Код:
: T >R 5 ; \ : T 5 SWAP EXECUTE ;
: ITER-T R> T ;
: T ['] ITER-T 2>R ;

_________________
Цель: сделать 64-битную Нову под Винду


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

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


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

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


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

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