Я, конечно, не фактор гуру, но поскольку их имена, кажется, подразумевают их использование:
набор данных : используется для обычного нажатия и извлечения значений,3 4 +
использует набор данных, чтобы нажать «3», а затем «4».Выполнение «+» выводит 2 значения из набора данных и возвращает ответ 5 обратно в набор данных.При запуске интерактивного сеанса фактора (по крайней мере, в Linux) содержимое этого стека печатается после каждого взаимодействия:
$> 1
--- Data stack:
1
$> 2
--- Data stack:
1
2
$> +
--- Data stack:
3
$> .
3
$>
callstack : используется для хранения слови их индивидуальный прогресс, в то время как их составляющие слова выполняются.Представьте, что вы определили лучший вариант суммы: : sum' ( seq-of-int -- summmation ) 0 [ + ] reduce 20 + ;
(это лучше, потому что вы получаете дополнительные 20 бесплатно!).Желая повторно использовать код, вы использовали слово reduce
со стандартным коэффициентом.Пока среда выполнения выполняет sum'
, она вызывает реализацию reduce
.Но, так как нам все еще нужно добавить дополнительные 20, кто-то должен записать, где запускаться снова, когда вернется reduce
.Эти заметки хранятся в стеке вызовов, скорее всего, с некоторыми вспомогательными данными во время выполнения отладки, чтобы помочь отладчикам понять, что происходит.
retainstack : используется для сохранения значенийна своего рода вспомогательный набор данных.В Forth можно использовать стек возвратов (аналог Forth для стека вызовов), чтобы действовать в качестве ретейста.Одна из проблем, связанных с этим подходом, заключается в том, что если вы вернетесь к своему слову, не очистив свой грязный хак, вы будете прыгать в неправильные места и наносить общий ущерб.Среда выполнения Forth увидит ваши значения, ожидая, что они будут хорошими примечаниями, которые он делает при вызове слова, и запутывается.Используя отдельный стек для адресов возврата, Factor может избежать этого.
стек имен : используется для хранения данных, необходимых для реализации динамических переменных ,Используя стек, вы можете скрыть старые имена с новыми при выполнении подпрограммы, а затем извлечь привязку, и старые имена будут восстановлены.
catchstack : использованоподдерживать обработку исключений.Используя стек, подпрограммы могут регистрировать свои собственные специальные обработчики для исключений и теневого поведения по умолчанию.Затем, когда слово вернется, старые обработчики можно будет легко восстановить, извлекая их из стека.