这在 shell 程序级别起作用:
>> a: "hello"
== "hello"
>> get to-lit-word "a"
== "hello"
但是在这样的函数中:
f: func [ arg1 ] [
v1: get 'arg1
? v1
v2: get to-lit-word "arg1"
? v2
]
>> f "goodbye"
V1 is a string of value: "goodbye"
** Script Error: arg1 has no value
** Where: f
** Near: v2: get to-lit-word "arg1"
如何使用“get”获取参数值?
最佳答案
首先,我会提到,当您在这样的FUNC中使用 v1 和 v2 时,您正在将它们写入封闭的上下文中。因此,它们将像“全局变量”一样起作用。禁止输入FUNC规范func [arg1 /local v1 v2]
。
(注意:Rebol3具有FUNCTION,该功能会自动扫描本地语言并为您构建基础FUNC。但是FUNCTION意味着Rebol2中还有其他功能,因此可以作为FUNCT使用。)
另外:当您编写get 'a
时,您并没有传递一个吸引人的单词。他们的轻度是阻止他们被抬头的原因,但是当评估者在其上奔跑时……一个轻词被评估为一个词:
>> type? 'a
== word!
如果您确实想将一个惯用语参数传递给函数,则必须引用该引号:
>> type? quote 'a
== lit-word!
GET显然并没有拒绝您给它传递一个俗语!,尽管我认为如果使用更窄的字体会更清楚。无论如何,我都会将其写为
get to-word "a"
。我可能是一个不好回答尝试回答您的主要问题的人。但我要指出的是,即使第一种模式在Rebol 3中也无效:
>> a: "hello"
== "hello"
>> get to-word "a"
** Script error: a word is not bound to a context
** Where: get
** Near: get to-word "a"
为了使GET能够从一个单词中找到一个值,仅仅“成为一个单词”是不够的。这个词必须绑定(bind)到充当“上下文”的某个对象上。绑定(bind)是单词本身附带的属性。
Rebol 2在此方面与Rebol 3略有不同。但是,如果您需要大量信息,则可以在该主题上找到一些帖子:
What is the summary of the differences in binding behaviour between Rebol 2 and 3?
通常,我发现我本可以通过说
to-word "some-string"
而说load "some-string"
来解决问题。因此在Rebol3中:>> a: "hello"
== "hello"
>> get load "a"
== "hello"
这些函数参数看起来是不同的故事。您可以通过查询上下文中的其他内容来将转换后的单词手动绑定(bind)到上下文中:
f: func [arg1 /local dummy] [
v2: get bind (to-word "arg1") (bind? 'dummy)
? v2
]
>> f "goodbye"
V2 is a string of value "goodbye"
除非您使用闭包,否则它在Rebol2中有效,但在Rebol3中无效:
f: closure [arg1 /local dummy] [
v2: get bind (to-word "arg1") (bind? 'dummy)
? v2
]
>> f "goodbye"
V2 is a string of value "goodbye"
在有关Rebol的神秘说法中(例如“没有变量,冒号不是赋值运算符”),您可以添加“Rebol实际上根本没有作用域”。
Is there a overall explanation about definitional scoping in Rebol and Red
您必须在聊天中向专家询问更多详细信息...