Gauche > Archives > 2013/05/19

2013/05/19 09:21:28 UTCyamasushi
#
Welcome to Racket v5.3.4.
> (require racket/match)
> (match '(1 1 2 2 1 1 1 2 2 2) [(list 1 ... 2 ... 1 ... 2 ...) (print "OK")]) 
"OK"> 

shuji@shuji-PC-LL750FD:~$ rlgosh
gosh> (use util.match)
#<undef>
gosh> (match '(1 1 2 2 1 1 1 2 2 2) [( 1 ... 2 ... 1 ... 2 ...) (print "OK")])
*** ERROR: Compile Error: syntax error in pattern (1 |...| 2 |...| 1 |...| 2 |...|)
#f:1:(match '(1 1 2 2 1 1 1 2 2 2) ((1 |...| 

Stack Trace:
_______________________________________
  0  (eval expr env)
        At line 173 of "/usr/local/share/gauche-0.9/0.9.4_pre3/lib/gauche/interactive.scm"
#
交互に繰り返すようなパタンにマッチさせようとすると失敗するのですけれど、これをgaucheで行うにはどうすればいいでしょうか? (とりあえず、いまはgroup-sequenceをつかっています。)
#
http://practical-scheme.net/wiliki/wiliki.cgi?Gauche%3a%e4%b8%87%e8%83%bd%e3%82%a2%e3%82%af%e3%82%bb%e3%82%b5%e3%82%92%e4%bd%bf%e3%81%86#H-88xpbn シンボルとオブジェクトが交互にあらわれる構文を定義したときにちょっと困ったのでした。
2013/05/19 10:01:08 UTCshiro
#
Gaucheのmatch (Wrightのmatch) はそういうパターンには対応してないです。繰り返し記号はシーケンスの最後にしか置けません (マニュアルのエントリを注意深く読んでください。リテラルの...に対応するのはoooと記してあります。メタ記号としての...と区別するため。)
#
繰り返しの個数がそれぞれ独立で良いなら正規言語なので、自分で有限オートマトンを書くか、pegでも表現できるとは思いますが、手っ取り早くやるならgroup-sequenceですかね。
2013/05/19 10:15:39 UTCyamasushi
#
なるほど。マニュアルを何度も読み返したのですが、そこのところがわからなかったのでした。ありがとうございます。