4
RebolのPARSE方言は、文字列だけでなく記号構造に対してもパターンマッチングと抽出ができるように一般化されています。同じルールで文字列解析とブロック解析を混在させるにはどうすればよいですか?
; match a single "a" character, followed by any number of "b" chars
>> string-rule: ["a" some "b"]
>> parse "abb" string-rule
== true
>> parse "aab" string-rule
== false
; look for a single apple symbol, followed by any number of bananas
>> block-rule: ['apple some 'banana]
>> parse [apple banana banana] block-rule
== true
>> parse [apple apple banana] block-rule
== false
しかし、のは、私はリンゴのシンボルを含むブロックを探しているとしましょう、その後、string-rule
に一致する文字列の任意の数:
; test 1
>> parse [apple "ab" "abbbbb"] mixed-rule
== true
; test 2
>> parse [apple "aaaa" "abb"] mixed-rule
== false
; test 3
>> parse [banana "abb" "abbb"] mixed-rule
== false
はどのようなmixed-rule
を策定するでしょう。このような?一見自然な答えが動作していないよう
http://www.rebol.net/wiki/Parse_Project#INTO
:
>> mixed-rule: ['apple some [string! into ["a" some "b"]]]
それはテスト1を通過して、正しくテストのためにfalseを返しますが、それは1がINTO使用できることを示唆しているドキュメントを見てみます3、それは間違ってテスト2で真を返します。これは私の間違いかRebol(私はr3 A111を使用しています)のバグですか?
うーん...あなたは、ANDで投げたら、はい、これは確かに動作します。それがバグの回避策であるのか、それともなぜそれが必要なのかについて一貫した推論があるかどうかは分かりますか? – HostileFork
コヒーレント推論:一般的なルールは、一致が成功すると(上記の場合は次の文字列に)一致する位置が前進することです。要素を2回(STRING!とINTOを使用して)一致させたい場合は、ANDキーワードを使用する必要があります。 – Ladislav