REBOL布局:如何自动创建布局单词
使用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
因此,我会自动创建cb1
到cb5
的单词,例如:
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。
链接地址: http://www.djcxy.com/p/91959.html