当我启动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
这是怎么回事?
答案 0 :(得分: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?"
我希望这会有所帮助。
你为什么不直接使用这个词?使用字符串并在以后转换为单词会产生很多开销,这通常是不必要的。
答案 1 :(得分:1)
如果你真的坚持使用“电子邮件?”字符串而不是'电子邮件?单词,那么你在没有观察到任何陌生感的情况下从中获取单词的最简单方法是使用LOAD函数,如下所示:
is-email-addr: get bind load "email?" bind? 'system