開始位置をランダムにすることで、Sliding Tile Puzzle の例を改善しようとしています。
これを行うためのより良い方法があります- 「値を文字列に変換し、それらを結合して評価のために渡すことは悪い習慣と見なされます。」--しかし、私が取ったアプローチは、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 ]
と、プログラムは実行されますが、ボタンはありません。関数の戻り値などがそのまま as コードに入れられるように、何らかの理由で過大評価されているようにp
見えますbox
。hgroup
確かに、簡単な構文エラーがここにありません。それは何ですか?