Почему все слова в Forth по умолчанию являются глобальными? - PullRequest
0 голосов
/ 22 марта 2020

Я учусь дальше. И не могу понять, почему все слова в языке по умолчанию являются глобальными?

Исправьте меня, пожалуйста, если я правильно называю ключи dict - слова.

Ответы [ 2 ]

2 голосов
/ 23 марта 2020

В моей четвертой системе слова по умолчанию создаются в словаре FORTH. Проверьте свою документацию для словаря и WORDLIST. Я могу создать любой словарь, который мне нужен, и сделать его по умолчанию. Ниже приведена простая манипуляция для создания двух слов с одинаковым именем в двух словарях и доступа к ним.

\ Create two vocabularies ( in the FORTH vocabulary )
VOCABULARY ENGLISH
VOCABULARY FRENCH

ORDER   \ Show the search order and current vocabulary
\ FORTH  EXTERNALS  ROOT  
\ Current: FORTH  

ALSO ENGLISH
ORDER 
\ ENGLISH  FORTH  EXTERNALS  ROOT  \ ENGLISH added to the search order
\ Current: FORTH                   \ New words created in FORTH

DEFINITIONS  ok      \ Change 'Current' to the top of the search order.
ORDER 
\ ENGLISH  FORTH  EXTERNALS  ROOT  
\ Current: ENGLISH                 \ New words created in ENGLISH

: trans  \ n -- ; 
  1- 6 * s" One   Two   Three Four  " DROP + 6 TYPE ;  

PREVIOUS  \ Remove the top vocabulary from the search order
ORDER 
\ FORTH  EXTERNALS  ROOT  \ ENGLISH dropped from the search order.
\ Current: ENGLISH        \ but still where new words will be created.

ALSO FRENCH DEFINITIONS
ORDER 
\ FRENCH  FORTH  EXTERNALS  ROOT  
\ Current: FRENCH                 \ New words created in FRENCH

: trans  \ n -- ; 
  1- 6 * s" Un    Deux  Trois Quatre" DROP + 6 TYPE ;

PREVIOUS DEFINITIONS

ALSO ENGLISH
1 trans 2 trans 3 trans 4 trans 
\ One   Two   Three Four   ok

PREVIOUS ALSO FRENCH
1 trans 2 trans 3 trans 4 trans 
\ Un    Deux  Trois Quatre ok

Например, ассемблер будет в другом словаре, который включается, когда слово, определяющее код, является казнены. После этого любые слова сначала ищутся в словаре ASSEMBLER.

Некоторые последующие реализации позволяют использовать МОДУЛИ. Я никогда не использовал их, но проверяю документацию для вашей системы.

2 голосов
/ 23 марта 2020

Если мы говорим о scoping , я думаю, что причина в том, что глобальный охват - это просто самый простой подход, доступный везде.

Да, по умолчанию все стандартные и пользовательские определенные слова имеют глобальную область видимости. Но для каждого слова его область действия начинается только с определения (т. Е. При переопределении предыдущее слово может использоваться в определении нового слова с тем же именем). И область действия локальных переменных ограничена телом определения, где эти переменные объявлены.

Forth также предоставляет более продвинутые методы для контроля видимости слов.

Слова сгруппированы в списки слов (a вид пространства имен ). И любая часть программы может быть исключена из области списка слов (то есть слов из этого списка слов). Для этого этот список слов должен быть исключен из порядка поиска в начале этой части программы (и возвращен в конце). Аналогичным образом, любая часть программы может быть включена в область списка слов путем включения этого списка слов в порядок поиска (и возврата в конец). Конечно, в этом случае мы имеем эффект маскирование имен .

Также многие системы Forth предоставляют API, который позволяет использовать имена, которые частично квалифицируются списками слов. Например: module1::submodule2::word3, где module1 - это слово, которое доступно в порядке поиска и которое возвращает идентификатор списка слов wid1 . submodule2 - это слово, которое определено в списке слов wid1 , и которое возвращает идентификатор списка слов wid2 , word3 - это слово, которое определено в списке слов wid2 . (См. RESOLVE-PQNAME слово в моей реализации в качестве ссылки).

Чтобы иметь более короткий доступ к какому-либо модулю, вы можете определить свой синоним, например, module1::submodule2 constant m и использовать префикс * 1039. * чтобы получить доступ к словам из этого подмодуля как m::word3.

...