Оценка блоков кода в Rebol3

Я пытаюсь улучшить пример головоломки со скользящими плитками, сделав начальные позиции случайными.

Есть лучший способ сделать это --"Преобразование значений в строки и объединить их вместе, чтобы передать для оценки." -- но подход, который я избрал, состоял в том, чтобы попытаться сгенерировать исходный код 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-data и load 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...

Однако, если я использую синтаксис hgroup do [ hgroup-data ], программа запускается, но кнопок нет: она выглядит как-то переоцененной, так что возвращаемые значения функций p и box и т. д. помещаются прямо в hgroup как код .

Конечно, здесь мне не хватает простой синтаксической ошибки. Что это такое?


person Kev    schedule 16.02.2015    source источник
comment
Ваша ссылка является локальным файлом hd   -  person kealist    schedule 16.02.2015
comment
упс! исправлено, мог бы поклясться, что нашел в Интернете и использовал его перед публикацией ...   -  person Kev    schedule 16.02.2015


Ответы (1)


Во-первых, я бы сказал, что лучше создавать блок напрямую, чем создавать строку и преобразовывать ее в блок. Но если вы действительно хотите это сделать, это должно помочь:

view/options compose/only [
    hgroup (load hgroup-data)
] [bg-color: gameback]
person Shixin Zeng    schedule 16.02.2015
comment
Я знаю, что лучше не делать этого таким образом, я сослался на документы, говорящие об этом в вопросе. :) Ваш ответ действительно работает, так что спасибо! - person Kev; 16.02.2015