6

这适用于外壳级别:

>> 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”获取参数值?

4

2 回答 2

2

对于初学者,我会提到当你在这样的 FUNC 中使用v1v2时,你正在将它们写入封闭的上下文中。所以他们会表现得像“全局变量”。为了抑制你输入你的 FUNC-spec func [arg1 /local v1 v2]

(注意:Rebol3 具有 FUNCTION,它会自动扫描本地变量并为您构建底层 FUNC。但 FUNCTION 在 Rebol2 中意味着其他东西,因此可以作为 FUNCT 使用。)


另外:当你写作时,get 'a你并没有传递一个字来获得。他们的 lit-ness 是让他们无法被查找的原因,但是当评估者运行它时......一个 lit-word 被评估为一个单词:

>> type? 'a
== word!

如果您真的想将 lit-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 能够从一个单词中找到一个值,仅仅“成为一个单词”是不够的。该词必须与充当“上下文”的某个对象绑定;绑定是附加到单词本身的属性。

Rebol 2 在这方面的行为与 Rebol 3 略有不同。但是,如果您想要大量信息,请参阅有关该主题的一些帖子:

Rebol 2 和 3 之间的绑定行为差异的总结是什么?

我经常发现我可以通过我应该说to-word "some-string"而不是说的情况来解决load "some-string"。所以在 Rebol3 中:

>> a: "hello"
== "hello"

>> get load "a"
== "hello"

这些函数参数看起来是一个不同的故事。您可以通过在该上下文中查询其他内容来手动将转换后的单词绑定到您获得的上下文:

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 实际上根本没有作用域”。

是否有关于 Rebol 和 Red 中定义范围的总体解释

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

于 2014-07-25T02:38:53.553 回答
1

对于它的好处,这可能会更短一些

>> f: func [ arg1] [
[    get bind to-word "arg1" 'arg1
[    ]
>> f "goodbye"
== "goodbye"
于 2014-07-25T13:52:34.287 回答