Когда пускаю в 99 сессии R3 Альфа и ввести это в качестве первой команды, я получаю сообщение об ошибке:Почему я не могу привязывать такие вещи, как EMAIL! в глобальном контексте при запуске интерпретатора?
>> 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 [email protected]
== true
Что происходит, здесь?
На свежем интерпретатором, * получить привязку/новое к слову «по электронной почте ?» связывать? 'system * тоже не работает. Фактически, запуск этой команды приводит к тому, что пример вашего интернатера может завершиться неудачно. Но если интерпретатор перезапускается после привязки, то работает пример INTERN, как и LOAD. Whyzzat? – HostileFork
Причина неправильного использования слова, как упоминалось в AltME, пытается написать простой remapper, который принимает * "em" * и * 'email! * И аббревиатура, чтобы создать * em? * В качестве псевдонима для * электронной почты? * И * em! * для * электронная почта! *. Это требует использования строкового отношения между словами. – HostileFork
«Почему?» Потому что, когда вы запускаете эту команду, вы добавляете слово «email»? в контекст пользователя, без присвоенного ему значения и не переносить значение из контекста системы или экспорта. Когда вы запускаете INTERN позже (LOAD вызывает INTERN), он видит существующее слово в пользовательском контексте и не переопределяет его, потому что это слово пользователя. Контекст пользователя по умолчанию не заполняется содержимым системы и контекстами экспорта - он заполняется по требованию. Если вам нужны системные значения, лучше использовать INTERN с самого начала. – BrianH