0

私はこれをしたい:

>> SET [a b] reduce [(ask "a: ") (ask "b: ")]
a: 1
b: 2
== ["1" "2"]
>>

プログラムで:

args: [a b]
block: copy []
foreach arg args [
  append block to-word "("
  append block 'ask
  append block rejoin [arg ": "]
  append block to-word ")"
]
set args reduce block

しかし、私はこのエラーを受け取ります:

>>     foreach arg args [
[          append block to-word "("
[          append block 'ask
[          append block rejoin [arg ": "]
[          append block to-word ")"
[        ]
== [( ask "a: " ) ( ask "b: " )]
>>    set args reduce block
** Script Error: ( has no value
** Near: ( ask "a: " ) (
>>
4

1 に答える 1

1

あなたが発見したのは、括弧はword!sではないということです。これらはRebolに組み込まれており、パーサーは、同じように、それらが一致することを確認しますblock!

これは良いことです。そうしないと、システム全体でコードが()))()不一致を処理することになります。あなたはその痛みから救われました!しかし、必要に応じて、自分の方言でこの痛みを再発明し、これまでに役立つものを活用する代わりに、BEGINやENDなどの単語を使用することができますparen!。:P

コードの最小限のパッチは次のとおりです。

args: [a b]
block: copy []
foreach arg args [
   p: to-paren []
   append/only block p
   append p 'ask
   append p rejoin [arg ": "]
]
set args reduce block

を書くことはできないことに注意してくださいcopy ()。一般的に言って、かっこはdoブロックよりも方言で扱うのが少し難しいです-それらは優先順位のために二重の義務を果たしています!通訳者は、結果をコピーしたいcopy ()式を括弧でくくろうとしていることを意味すると考えています。:(

物事をブロックとして構築し、最後の最後にのみ変換することで、頭痛の種を減らすことができます。

>> to-paren [ask "a: "]
== (ask "a: ")

PSかっこは実際には必要ないことを指摘して、あなたの質問から気をそらしたくありませんでした。

>> SET [a b] reduce [ask "a: " ask "b: "]

しかし、それについての良いニュースは、この場合、親が「より高い目的」を果たすことをいとわないのであれば、常に存在するということです。compose

args: [a b]
block: copy []
foreach arg args [
    append block compose [ask (rejoin [arg ": "])]
]
set args reduce block

作成は、「テンプレート方言」を使用するようなものです。これは、括弧に含まれる表現を減らすだけで、他のすべてはそのままにします。例を挙げてコードを作成するのは良い方法ですが、生成されたコードがすでに優先順位として括弧を使用している場合は、間違いなく問題が発生します。それでも...方言が単語に意味を与えるのと同じように、あらゆる目的で括弧を使用できることを示します。

于 2009-12-18T06:02:09.877 に答える