1

当我启动 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

这里发生了什么?

4

2 回答 2

5

绑定不会将单词添加到上下文中,除非您告诉它 - 您必须使用bind/new.

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

但是您的问题显示了对 R3 绑定模型的一些误解。R3 中没有单一的全局上下文,与 R2 不同。您示例中的单词'system绑定到任务本地共享脚本上下文,即用户上下文。在用户上下文中为单词获取正确的值通常意味着从系统上下文中导入它们,或者从加载的模块中导出,这个过程称为单词的实习。

要在此处执行您显然想做的事情,最好使用intern,如下所示:

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

之所以to-block使用,是因为intern通常用于对整个代码块进行操作。我将在下一个版本中修复它,这样它也可以直接处理单词;那么你将能够做到这一点:

>> get intern to-word "email?"

我希望这有帮助。

为什么不直接用这个词?使用字符串并稍后转换为单词有很多开销,这通常是不必要的。

于 2010-06-19T19:59:28.313 回答
1

如果你真的坚持使用“电子邮件”?字符串而不是 'email? 单词,那么您在不观察到任何奇怪的情况下从中获取单词的最简单方法是使用 LOAD 函数,如下所示:

is-email-addr: get bind load "email?" bind? 'system
于 2010-06-20T07:20:51.607 回答