Памятка по откатным техникам.
Используемые понятия:
Итератор - функция, при вызове которой код идущий после этого вызова фактически является каллбеком (callback) этой функции.
Отсечение - операция удаляющая всё на стеке возвратов вплоть до достижения метки.
Код:
RP@ .... iter1: ... iter2: ... RP!
Поставить на откат - функция действующая на обратном ходу (при выходе из слова, при EXIT и пр.)
Рекомендации:
Перед началом кода итератора
желательно нужно просчитать возможное изменение данных на стеке. Если этого не делать, то можно получить на выходе некорректные данные и/или сложно обнаруживаемые баги.
Поскольку стеки могут изменяться, как на прямом, так и на обратном ходу, это очень важно.
Поэтому, если в итератор передаются не только требуемые ему значения, то дополнительные параметры нужно поставить на откат.
Один из фрагментов рабочего кода:
Код:
RP@ \ это дополнительное значение для итератора
['] FALSE >R \ если итератор не дал результатов, то укладываем на стек данных 0
['] DROP >R \ а это наш "нормализатор". Уберёт на обратном ходу доп. значение ( RP@ ) со стека данных
.... \ тут уже итератор и нужные ему параметры
Отсечение это безповоротный выход из итераторов в т. ч. и вложенных. Вместо того, чтобы распутывать каждый итератор как верёвочку, мы рубим часть стека возвратов, как Македонский гордиев узел. Просто, изящно, эффективно, быстро.
Разумеется, если итератор будет хранить служебные данные в хипе и пр., то отсечение не лучший выход. Ещё память отлавливать.
Отсечение (cut) применяется когда перебор уже не имеет смысла (нашли нужный результат и пр.)
Памятка по откатным техникам.
Используемые понятия:
Итератор - функция, при вызове которой код идущий после этого вызова фактически является каллбеком (callback) этой функции.
Отсечение - операция удаляющая всё на стеке возвратов вплоть до достижения метки.
[code]
RP@ .... iter1: ... iter2: ... RP!
[/code]
Поставить на откат - функция действующая на обратном ходу (при выходе из слова, при EXIT и пр.)
Рекомендации:
Перед началом кода итератора [s]желательно[/s] нужно просчитать возможное изменение данных на стеке. Если этого не делать, то можно получить на выходе некорректные данные и/или сложно обнаруживаемые баги.
Поскольку стеки могут изменяться, как на прямом, так и на обратном ходу, это очень важно.
Поэтому, если в итератор передаются не только требуемые ему значения, то дополнительные параметры нужно поставить на откат.
Один из фрагментов рабочего кода:
[code]
RP@ \ это дополнительное значение для итератора
['] FALSE >R \ если итератор не дал результатов, то укладываем на стек данных 0
['] DROP >R \ а это наш "нормализатор". Уберёт на обратном ходу доп. значение ( RP@ ) со стека данных
.... \ тут уже итератор и нужные ему параметры
[/code]
Отсечение это безповоротный выход из итераторов в т. ч. и вложенных. Вместо того, чтобы распутывать каждый итератор как верёвочку, мы рубим часть стека возвратов, как Македонский гордиев узел. Просто, изящно, эффективно, быстро.
Разумеется, если итератор будет хранить служебные данные в хипе и пр., то отсечение не лучший выход. Ещё память отлавливать.
Отсечение (cut) применяется когда перебор уже не имеет смысла (нашли нужный результат и пр.)