这在 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

您必须在聊天中向专家询问更多详细信息...

10-02 01:45