REBOL布局:如何自动创建布局词 - 单词没有上下文



使用 REBOL/View 2.7.8 核心,我想通过自动为各种布局项分配单词来预先准备视图布局,如以下示例所示。而不是

prepared-view: [across 
                cb1: check 
                label "Checkbox 1"
                cb2: check
                label "Checkbox 2"
                cb3: check
                label "Checkbox 3"
                cb4: check
                label "Checkbox 4"
                ]
    view layout prepared-view

因此,我希望自动创建cb1cb5的单词,例如:

prepared-view2: [ across ]
    for i 1 4 1 [
        cbi: join "cb" i
        cbi: join cbi ":"
        cbi: join cbi " check"
        append prepared-view2 to-block cbi
        append prepared-view2 [
        label ]
        append prepared-view2 to-string join "Checkbox " i 
        ]
    view layout prepared-view2

然而,虽然difference prepared-view prepared-view2显示正在解析的块没有差异(== []),但第二个脚本会导致错误:

    ** Script Error: cb1 word has no context
    ** Where: forever
    ** Near: new/var: bind to-word :var :var

我花了几个小时试图理解为什么,我认为新词以某种方式需要绑定到特定的上下文中,但我还没有找到解决问题的任何方法。

我需要做什么?

bind prepared-view2 'view  
view layout prepared-view2

创建正确的绑定。

这是动态创建布局的另一种方法

>> l: [ across ]
== [across]
>> append l to-set-word 'check
== [across check:]
>> append l 'check
== [across check: check]
>> append l "test"
== [across check: check "test"]
>> view layout l

然后,您可以使用循环创建不同的变量以添加到布局中。

当您使用 TO-BLOCK 将字符串转换为块时,这是一个低级操作,不会通过"普通"绑定到"默认"上下文。 所有单词都将解绑:

>> x: 10      
== 10
>> code: to-block "print [x]"
== [print [x]]
>> do code
** Script Error: print word has no context
** Where: halt-view
** Near: print [x]

因此,当您想在运行时从原始字符串构建代码时,其查找将起作用,一种选择是使用 LOAD,它将执行一些默认操作,这可能适用于某些代码(加载器是为您正在运行的代码创建绑定的方式来自源代码)

>> x: 10
== 10
>> code: load "print [x]"
== [print [x]]
>> do code
10

或者,您可以显式命名上下文/对象(或通过绑定到该上下文中的示例词)并使用 BIND。

相关内容

  • 没有找到相关文章

最新更新