owk を引き続きいじっています
一年前 にも何かやってましたが、 JSON やら LTSV やらで記録されたログを相手にすることになったので、 owk をまたいじっています。
https://github.com/nakamuray/owk
JSON をデフォルトにしました。
今までは map やら fold やらのどれを利用するかはコマンドラインオプションで指定していましたが、 それらは owk 言語内に移しました。
色々関数やら演算子やらを増やしました。
一年前と同様の処理は以下のようになります:
$ ps aux | owk -i word 'filter { _.11 =~ "chrome" } >> map { _.4 } >> fold `+` 0'
2.7
... 見た目それっぽくなった代わりに、長い。
以下、思っていることをだらだら書く。
もともと全体として Conduit だったものを、 Conduit (Source) を値として言語内に放り込むような設計に変えた。
それにより、今まで言語の外側にあり、コマンドラインオプションで指定していた map や filter といった機能を言語内の関数として書けるようになった。
が、それに伴い現在は get/put (await/yield) や next といった機能を失っている。 ここはなんとかしたいのだけど、うまい方法が思いついていない。
辞書の要素の更新がだるい。
更新というか、辞書自体は immutable なので、新たな値を持つ辞書の生成なのだが。
dict[key, newvalue]
と書くようにしたのだけど、 例えば値を +1 するようなのはdict[key, dict[key] + 1]
みたいな事になる。辞書がネストすると地獄。haskell 的には、その手の操作を簡単に書けるようにするのが lens という認識でいるのだけれど、 アレいまいち理解できていないのでホントにそれで解決する問題なのか分からない。
やれることが jq と被ってるくせに、速度が jq の倍くらい遅い。
JSON 以外の形式も扱えるという特徴はあるけど、他にも何か差別化できる要因が欲しいところ。
名前変えよう。
あえて awk と似た名前にしたのだけど、やっぱりごっちゃになって typo することがある。 何かいい名前ないか。