Gauche > Archives > 2011/10/16

2011/10/16 07:47:37 UTCshiro
#
(regexp-comiple '(alt)) がBUS Errorになるとの @gengar68 さんからの報告。後で参照しやすいようにこっちにメモ。
#
原因はregexpエンジンのコードジェネレータがaltには最低限ひとつの選択肢があると決め打ちしてるためなんだが、さてどう直すべきか。
#
(alt)は「試せる手がひとつもない」ということだから、無条件にfailとする、という考え方があり得る。orの単位元が#fなのと同じ。
#
ただ、regexp-unparseによってASTは文字列による正規表現に変換できる必要があって、選択肢がひとつもないaltは|では表記できない。とすればaltはひとつ以上の枝を持たなければならない、と仕様を変える方がいいかもしれない。
#
と書いてる端から、必ずfailするという表記が文字列による正規表現でも可能なことを思いついた。negative lookahead assertionを使って #/(?!)/ などとすれば必ずそこでfailする。
#
プログラム的にASTを生成することを考えると、選択肢の無いaltも受け付けられるようにしておいた方が便利。気にすべき例外条件がひとつ減るから。問題があるとすれば unparse -> parse でround-tripが保証されないことだが、正規表現としての意味が同じでさえあれば、気にする必要はないか。
2011/10/16 08:05:44 UTCshiro
#
むー、この要旨はamazon絡みの話をばっさり削っててそれはまあひとつの判断だけど、そのせいで"Eat your own dogfood"の大事な文脈が落ちてる。 http://japan.internet.com/busnews/20111013/8.html Google社員もGoogleでサーチはしてるだろう。Steve Yeggeがdogfoodを持ち出したのは、「社内の人間だけが使える直接のライブラリコールではなく、サードパーティが使うであろうWeb APIをGoogleの開発者も使って自社のサービスを組み立てろ。そうすれば、実際にサービスを作るにあたってどういう公開APIが必要で、今何が足りないかがわかる」って発言だったはず。
2011/10/16 08:39:31 UTCgengar68@twitter
#
gosh> (regexp-compile (regexp-ast #/(?!)/))
*** ERROR: pair required, but got ()
こんなことも起きました.
2011/10/16 08:48:49 UTCshiro
#
むむ。#/(?!)/ をパーズしたら (0 #f (nassert)) になるのに、外部から同じASTを与えるとエラーになるな。ASTのvalidationのとこでしくじってるかな。
#
あれー、pass 3に渡ってるASTは直接パーズした場合でも外から与えた場合でも同じだなあ。
2011/10/16 09:20:26 UTCshiro
#
わかった。compileは正常に終了してるんだけど、表示する時にunparseするとこでエラーになってるんだ。
2011/10/16 10:13:52 UTCshiro
#
なおした。 d9cb084