1

我试图通过使起始位置随机来改进滑动瓷砖拼图示例。

有一种更好的方法可以做到这一点——“将值转换为字符串并将它们连接在一起以传递给进行评估被认为是不好的做法。” --但我采取的方法是尝试生成 Rebol3 源,然后对其进行评估。我认为它生成正确,我认为:

random/seed now
arr: random collect [ repeat tilenum 9 [ keep tilenum ] ]
hgroup-data: copy {}
repeat pos 9 [
    curtile: (pick arr pos)
    append hgroup-data either curtile = 9
        [ reduce "x: box tilesize gameback " ]
        [ rejoin [ { p "} curtile {" } ] ]
    if all [(pos // 3) = 0 pos != 9] [ append hgroup-data " return^/" ]
]
print hgroup-data

...输出类似:

 p "4" x: box tilesize gameback  p "5"  return
 p "3"  p "7"  p "1"  return
 p "2"  p "8"  p "6" 

...如果我然后将其复制并粘贴到此部分中,则可以正常工作:

view/options [
    hgroup [ 
PASTE-HERE
    ]
] [bg-color: gameback]

但是,如果我尝试动态执行此操作:

view/options [
    hgroup [ 
        hgroup-data
    ]
] [bg-color: gameback]

...(也print hgroup-data,,do hgroup-dataload hgroup-data),我得到这个错误:

** GUI ERROR: Cannot parse the GUI dialect at: hgroup-data

...(或at: print hgroup-data等,取决于我尝试了哪种变体。)

如果我尝试load [ hgroup-data ],我会得到:

** Script error: extend-face does not allow none! for its face argument
** Where: either if forever -apply- apply init-layout make-layout actor all foreach do-actor unless -apply- apply all build-face -apply- apply init-layout make-layout actor all foreach do-actor if build-face -apply- apply init-layout make-layout actor all foreach do-actor unless make-face -apply- apply case view do either either either -apply-
** Near: either all [
    word? act: dial/1
    block? body: get dial...

但是,如果我使用 syntax hgroup do [ hgroup-data ],程序会运行,但没有按钮:它似乎被高估了,因此函数的返回值等p直接box放入hgroupas 代码中。

当然,我在这里遗漏了一个简单的语法错误。它是什么?

4

1 回答 1

3

首先,我会说最好直接构造一个块,而不是构造一个字符串并将其转换为块。但如果你真的想这样做,这应该可以解决问题:

view/options compose/only [
    hgroup (load hgroup-data)
] [bg-color: gameback]
于 2015-02-16T14:33:17.670 回答