見出し画像

2024年9月12日 千里の道もベッドから起き上がってから

 写真はウェットフードをもらえなくて怒っているむく。

 日々仕事。毎日仕事ばかりしているように見えるが、それほど悪くない。まあまあ面白い仕事なのは幸せ。もちろん、働かなくても良いのであれば働かないけれども。仕事以外にもOSSの活動を少し。自分の作成したツールだが、なぜか利用者がいる。この英語話者の利用者が、いろいろと要望を言ってくれるので対応している。自分のプログラミング技術が向上するので面白い。

 今回の要望は、実行の度に生成される、あるtypescriptのファイルを、毎回上書きではなくてmergeしてほしいという要望だった。ファイルのマージについては3通り思いつく。まずは、実直にastという構文木にパースし、そこからデータを掘っていくというもの。オブジェクトのkey:valueを取得してマージしていけば解決する。この方法は構文木に解析するのは簡単だ。tscやbabel、あとswcなどを使えば簡単に構文木に変換できる。しかし、変換したあとを解析するのが面倒くさい。かなり時間が掛かることが予想された。

 次に、peggyというパーサジェネレータを使用する方法だ。これは文字を頭から読んでいって、特定のワードが出てきたら区切る、みたいなことの繰り返しで処理が進んでいく。いまのツールでも、zodSchemaの解析はpeggyが行っている。peggyの練習も兼ねて、ツールに搭載したのである。この方法の問題点は、パーサジェネレータをつくるのが面倒くさいという点にある。作成に結構時間がかかる。これをつくるくらいなら、構文木を解析したほうが早くて正確だろう。

 最後に思いついたのは、そのままテキストファイルとして一行ずつ読んでいき、パースするものだ。不要な行は無視し、そのままkeyとvalueに変換していく。非常に単純な実装で、イレギュラーがないかぎりは高速だし簡単につくれる。ただ、たとえばネストしたオブジェクトとかになってくると非常に難しい。そういう複雑なケースではパーサジェネレータか、構文木解析に頼ることになる。ひとまず、今回は3番目の手法をやってみた。大体30分くらいで実装できた。たぶんastにする方式だと4時間はかかる。パーサジェネレータなら2時間くらいか。とりあえずこれでいってみて、だめなケースが多いようであればastにしよう、と思った。最初から完璧を目指しても良いけれど、そこまで使われない機能なら、これくらいの実装で良いか、という割り切りも重要かもしれない。そうしてやっつけ仕事をしているうちに、どんどん負債が積み重なって、将来の自分が苦しむ羽目になることもある。

 astの勉強にもなるので、やっぱりastでの実装に切り替えようか、など検討しつつ……。

この記事が気に入ったらサポートをしてみませんか?