Hos*_*ork 1 reflection rebol scoping
当我启动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
Run Code Online (Sandbox Code Playgroud)
但是,如果我退出,重新启动并执行测试以证明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
Run Code Online (Sandbox Code Playgroud)
这里发生了什么?
绑定不会向上下文添加单词,除非您告诉它 - 您必须使用bind/new.
>> get bind/new to-word "email?" bind? 'system
Run Code Online (Sandbox Code Playgroud)
但是你的问题显示了对R3绑定模型的一些误解.R3中没有单一的全局上下文,而不像R2.'system示例中的单词绑定到任务本地共享脚本上下文,即用户上下文.在用户上下文中获取正确的单词值通常意味着从系统上下文或已加载模块的导出中导入它们,这个过程称为实习单词.
要做你在这里做的事情,你最好使用intern,如下所示:
>> get first intern to-block "email?"
Run Code Online (Sandbox Code Playgroud)
使用它to-block是因为intern通常用于对整个代码块进行操作.我将在下一个版本中修复它,因此它也可以直接处理单词; 那么你将能够做到这一点:
>> get intern to-word "email?"
Run Code Online (Sandbox Code Playgroud)
我希望这有帮助.
你为什么不直接使用这个词?以后使用字符串并转换为单词会产生很多开销,这通常是不必要的.
| 归档时间: |
|
| 查看次数: |
131 次 |
| 最近记录: |