是否可以在 Red 中测试值?对于上下文中不在全局上下文中的变量?

Is it possible in Red to test value? for a variable inside a context not in global context?

在最后一个例子中,探测值? 'a returns true 因为它检测到 'a 在全局上下文中具有价值。但我想专门在本地上下文中测试 'a,是否有语法可以这样做?

    context [
        probe value? 'a; false
    ]

    context [
        a: 1
        probe value? 'a; true
    ]

    ; would like false instead of true
    a: 1
    context [
        probe value? 'a; true
    ]

Is it possible in Red to test value? for a variable inside a context not in global context?

根据定义,没有。因为没有"the global context"这样的东西。

记住 "Rebol (Red) actually does not have scope at all" ... "Rebol (Red) fakes it."

(参见:Is there a overall explanation about definitional scoping in Rebol and Red

Rebol 有 BIND?询问一个任意的 ANY-WORD!它绑定到的地方(如果有的话)。红色称之为 CONTEXT?。所以你可以做的是问一个词的绑定是否是你关心的上下文。

ctx1: context [a: 10]
ctx2: context [a: 20]

word: bind 'a ctx1

print ctx1 = context? word ; true
print ctx2 = context? word ; false

所以如果你所说的 "global context" 实际上是所谓的 SYSTEM/WORDS 对象,那么这就是你的测试:

context [
    probe value? 'a ; false
]

context [
    a: 1
    probe system/words <> context? 'a ; true
]

a: 1
context [
    probe system/words <> context? 'a ; false
]

至于这是否适合您的目的,我不知道。请记住,Rebol/Red 中没有范围,除非你设置了一些对你正在做的事情足够有效的假近似值。

这里的解决方案没有在'global'system/words中搜索,而是在'local'self[=15中搜索=]

>> a: 1
== 1
>> context [
[        probe all [
[            find words-of self 'a 
[            value? pick find words-of self 'a 1
[        ]
[        probe value? 'a
[    ]
none
true
== make object! []
>> 
>> context [
[        probe all [
[            find words-of self 'a 
[            value? pick find words-of self 'a 1
[        ]
[        probe value? 'a
[        a: 2
[    ]
none
false
== make object! [
   a: 2
]
>> 
>> context [
[        a: 2
[        probe all [
[            find words-of self 'a 
[            value? pick find words-of self 'a 1
[        ]
[        probe value? 'a
[    ]
true
true
== make object! [
    a: 2
]

我认为最简单的检查是

context [
    probe in self 'a ; none
]

它 returns none 而不是 false,但无论如何这是唯一的其他虚假值,因此完全适合检查。如果你需要它是false,你可以把to-logic放在前面。