是否可以在 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
放在前面。
在最后一个例子中,探测值? '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
放在前面。