Если мы говорим о scoping , я думаю, что причина в том, что глобальный охват - это просто самый простой подход, доступный везде.
Да, по умолчанию все стандартные и пользовательские определенные слова имеют глобальную область видимости. Но для каждого слова его область действия начинается только с определения (т. Е. При переопределении предыдущее слово может использоваться в определении нового слова с тем же именем). И область действия локальных переменных ограничена телом определения, где эти переменные объявлены.
Forth также предоставляет более продвинутые методы для контроля видимости слов.
Слова сгруппированы в списки слов (a вид пространства имен ). И любая часть программы может быть исключена из области списка слов (то есть слов из этого списка слов). Для этого этот список слов должен быть исключен из порядка поиска в начале этой части программы (и возвращен в конце). Аналогичным образом, любая часть программы может быть включена в область списка слов путем включения этого списка слов в порядок поиска (и возврата в конец). Конечно, в этом случае мы имеем эффект маскирование имен .
Также многие системы Forth предоставляют API, который позволяет использовать имена, которые частично квалифицируются списками слов. Например: module1::submodule2::word3
, где module1
- это слово, которое доступно в порядке поиска и которое возвращает идентификатор списка слов wid1 . submodule2
- это слово, которое определено в списке слов wid1 , и которое возвращает идентификатор списка слов wid2 , word3
- это слово, которое определено в списке слов wid2 . (См. RESOLVE-PQNAME
слово в моей реализации в качестве ссылки).
Чтобы иметь более короткий доступ к какому-либо модулю, вы можете определить свой синоним, например, module1::submodule2 constant m
и использовать префикс * 1039. * чтобы получить доступ к словам из этого подмодуля как m::word3
.