Forth http://fforum.winglion.ru/ |
|
Уголок бектрекинга http://fforum.winglion.ru/viewtopic.php?f=58&t=3189 |
Страница 1 из 1 |
Автор: | Victor__v [ Вс авг 12, 2018 11:59 ] |
Заголовок сообщения: | Уголок бектрекинга |
Находим факториал в 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! |
Автор: | Victor__v [ Сб ноя 17, 2018 17:03 ] |
Заголовок сообщения: | Re: Уголок бектрекинга |
Памятка по откатным техникам. Используемые понятия: Итератор - функция, при вызове которой код идущий после этого вызова фактически является каллбеком (callback) этой функции. Отсечение - операция удаляющая всё на стеке возвратов вплоть до достижения метки. Код: RP@ .... iter1: ... iter2: ... RP! Поставить на откат - функция действующая на обратном ходу (при выходе из слова, при EXIT и пр.) Рекомендации: Перед началом кода итератора Поскольку стеки могут изменяться, как на прямом, так и на обратном ходу, это очень важно. Поэтому, если в итератор передаются не только требуемые ему значения, то дополнительные параметры нужно поставить на откат. Один из фрагментов рабочего кода: Код: RP@ \ это дополнительное значение для итератора ['] FALSE >R \ если итератор не дал результатов, то укладываем на стек данных 0 ['] DROP >R \ а это наш "нормализатор". Уберёт на обратном ходу доп. значение ( RP@ ) со стека данных .... \ тут уже итератор и нужные ему параметры Отсечение это безповоротный выход из итераторов в т. ч. и вложенных. Вместо того, чтобы распутывать каждый итератор как верёвочку, мы рубим часть стека возвратов, как Македонский гордиев узел. Просто, изящно, эффективно, быстро. Разумеется, если итератор будет хранить служебные данные в хипе и пр., то отсечение не лучший выход. Ещё память отлавливать. Отсечение (cut) применяется когда перебор уже не имеет смысла (нашли нужный результат и пр.) |
Автор: | Victor__v [ Вт ноя 20, 2018 15:35 ] |
Заголовок сообщения: | Re: Уголок бектрекинга |
Из каллбекового слова в итератор и обратно Код: : T >R 5 ; \ : T 5 SWAP EXECUTE ;
: ITER-T R> T ; : T ['] ITER-T 2>R ; |
Страница 1 из 1 | Часовой пояс: UTC + 3 часа [ Летнее время ] |
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/ |