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

...
Google Search
Forth-FAQ Spy Grafic

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




Ответить
Имя пользователя:
Заголовок:
Текст сообщения:
Введите текст вашего сообщения. Длина сообщения в символах не более: 60000

Размер шрифта:
Цвет шрифта
Настройки:
BBCode ВКЛЮЧЕН
[img] ВЫКЛЮЧЕН
[flash] ВЫКЛЮЧЕН
[url] ВКЛЮЧЕН
Смайлики ВЫКЛЮЧЕНЫ
Отключить в этом сообщении BBCode
Не преобразовывать адреса URL в ссылки
Вопрос
Теперь гостю придется вводить здесь пароль. Не от своей учетной записи, а ПАРОЛЬ ДЛЯ ГОСТЯ, получить который можно после регистрации на форуме через ЛС.:
Этот вопрос предназначен для выявления и предотвращения автоматических регистраций.
   

Обзор темы - Уголок бектрекинга
Автор Сообщение
  Заголовок сообщения:  Re: Уголок бектрекинга  Ответить с цитатой
Из каллбекового слова в итератор и обратно
Код:
: T >R 5 ; \ : T 5 SWAP EXECUTE ;
: ITER-T R> T ;
: T ['] ITER-T 2>R ;
Сообщение Добавлено: Вт ноя 20, 2018 15:35
  Заголовок сообщения:  Re: Уголок бектрекинга  Ответить с цитатой
Памятка по откатным техникам.

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

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

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

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

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


Отсечение это безповоротный выход из итераторов в т. ч. и вложенных. Вместо того, чтобы распутывать каждый итератор как верёвочку, мы рубим часть стека возвратов, как Македонский гордиев узел. Просто, изящно, эффективно, быстро.
Разумеется, если итератор будет хранить служебные данные в хипе и пр., то отсечение не лучший выход. Ещё память отлавливать.
Отсечение (cut) применяется когда перебор уже не имеет смысла (нашли нужный результат и пр.)
Сообщение Добавлено: Сб ноя 17, 2018 17:03
  Заголовок сообщения:  Уголок бектрекинга  Ответить с цитатой
Находим факториал в 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!
Сообщение Добавлено: Вс авг 12, 2018 11:59

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


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