Почему я не могу связать такие вещи, как EMAIL! в глобальном контексте при запуске интерпретатора? - PullRequest
1 голос
/ 18 июня 2010

Когда я запускаю сеанс R3 Alpha 99 и ввожу его в качестве первой команды, я получаю ошибку:

>> is-email-addr: get bind to-word "email?" bind? 'system
** Script error: email? is not in the specified context
** Where: bind
** Near: bind to-word "email?" bind? 'system

Но если я выйду, перезапустите и вместо этого выполните тест, чтобы доказать, чтоemail? примитив живет в глобальном контексте, как объект system, сам тест заставляет мой псевдоним работать:

>> equal? bind? 'system bind? 'email?
== true

>> is-email-addr: get bind to-word "email?" bind? 'system
>> is-email-addr fork@example.com
== true

Что здесь происходит?

Ответы [ 2 ]

5 голосов
/ 19 июня 2010

Привязка не добавляет слова в контекст, если вы не скажете это - вы должны использовать bind/new.

>> get bind/new to-word "email?" bind? 'system

Но ваш вопрос показывает несколько неправильных представлений о модели привязки R3. В R3 нет единого глобального контекста, не похожего на R2. Слово 'system в вашем примере связано с контекстом общего сценария локальной задачи, он же пользовательский контекст. А получение правильного значения слов в контексте пользователя часто означает их импорт из системного контекста или экспорта загруженных модулей, процесс, известный как interning the words.

Чтобы сделать то, что вы, очевидно, хотите сделать здесь, лучше всего использовать intern, например:

>> get first intern to-block "email?"

to-block используется, потому что intern обычно используется для работы с целыми блоками кода. Я исправлю это в следующей версии, чтобы он мог работать и со словами напрямую; тогда вы сможете сделать это:

>> get intern to-word "email?"

Надеюсь, это поможет.

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

1 голос
/ 20 июня 2010

Если вы действительно настаиваете на использовании "электронной почты?" Строка вместо 'электронной почты? word, тогда для вас самым простым способом получить слово из него, не наблюдая никаких странностей, было бы использование функции LOAD следующим образом:

is-email-addr: get bind load "email?" bind? 'system
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...