Стек вызовов? retainstack? namestack?
На этой странице руководства Фактора рассказывается о следующих типах стеков, которые хранятся в продолжениях:
- datastack
- retainstack
- стек вызовов
- namestack
- catchstack
Что именно эти стеки содержат? Три наиболее запутанных для меня - это стеки вызовов, ретейстек и стеки имен.
1 ответ
Я, конечно, не фактор гуру, но так как их имена, кажется, подразумевают их использование:
хранилище данных: используется для обычного нажатия и извлечения значений.
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 может избежать этого.
namestack: используется для хранения данных, необходимых для реализации динамических переменных. Используя стек, вы можете скрыть старые имена с новыми, выполняя подпрограмму, а затем вытолкнуть привязку, и старые имена будут восстановлены.
catchstack: используется для поддержки обработки исключений. Используя стек, подпрограммы могут регистрировать свои собственные специальные обработчики для исключений и теневого поведения по умолчанию. Затем, как только слово вернется, старые обработчики можно будет легко восстановить, извлекая их из стека.