【问题标题】:Is it possible in Red to test value? for a variable inside a context not in global context?红色是否可以测试价值?对于不在全局上下文中的上下文中的变量?
【发布时间】:2017-11-11 22:35:58
【问题描述】:

在最后一个例子中,探测值? 'a 在检测到 'a 在全局上下文中具有值时返回 true。但我想只在本地上下文中测试 '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
    ]

【问题讨论】:

    标签: red


    【解决方案1】:

    我认为最简单的检查是

    context [
        probe in self 'a ; none
    ]
    

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

    【讨论】:

    • 真的更好。我只是在添加它之前。
    • 我做了一个非常相似的,没有看到你的:>> a: 1 context [probe same? self context? 'a] ; >> false
    • @daveanderson 我什至不明白上下文 [(a: 1) probe in self 'a] 没有返回,而它不应该因为有 a: 1 ?
    • @user310291 我不确定那个,但我注意到当你评估它时,返回的对象没有a 值,所以括号必须阻止这个词在对象中定义。在将块提供给 context 之前,您可以 compose 块,并且将事先评估括号。
    【解决方案2】:

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

    根据定义,没有。因为没有“全球背景”这样的东西。

    记住“Rebol (Red) 实际上根本没有作用域” ... “Rebol (Red) 伪造它。”

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

    Rebol 有 BIND 吗?问一个任意的任何字!它绑定到的地方(如果在任何地方)。 Red 将此称为 CONTEXT?。所以你可以做的是询问一个词的绑定是否是你关心的上下文。

    ctx1: context [a: 10]
    ctx2: context [a: 20]
    
    word: bind 'a ctx1
    
    print ctx1 = context? word ; true
    print ctx2 = context? word ; false
    

    因此,如果您所说的“全局上下文”实际上是所谓的 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 中没有范围,除非您为您正在做的事情设计了一些足够好的假近似值。

    【讨论】:

    • Red doesn't have that (yet?) is not context? native 做你想做的事?
    • @user310291 见update with CONTEXT? operation,不知道他们改名为 BIND?到那个。
    • @HostileFork 感谢上下文?看来这就是我想要的:)
    【解决方案3】:

    这里的解决方案不是在“全局”system/words 中搜索,而是在“本地”self

    >> 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
    ]
    

    【讨论】:

    • 如果我只提前知道 'a 的值就可以了吗?
    • 我不明白你的问题?
    • 我想测试变量 a 是否已在本地上下文中声明,无论 a: 1, 2, "test" ...在您的示例中,您测试值 a=1 吗?还是我理解错了?
    • 不,我首先在 words-of 对象中测试单词 a 的存在,然后如果存在的单词有值。我看到我的回答中有一些遗物。我会改正的
    猜你喜欢
    • 2023-03-20
    • 1970-01-01
    • 1970-01-01
    • 2010-09-27
    • 2014-06-06
    • 2015-05-10
    • 1970-01-01
    • 1970-01-01
    • 2013-10-23
    相关资源
    最近更新 更多