【问题标题】:REBOL layout: How to create layout words automatically - word has no context?REBOL 布局:如何自动创建布局词 - 词没有上下文?
【发布时间】:2016-09-22 17:02:48
【问题描述】:

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

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

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

我需要做什么?

【问题讨论】:

    标签: rebol rebol3 rebol2


    【解决方案1】:
    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
    

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

    【讨论】:

      【解决方案2】:

      当您使用 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。

      【讨论】:

      • ...所以我只需将 append prepared-view2 to-block cbi 更改为 append prepared-view2 load cbi... 是的,这行得通!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多