文字列をそのままパイプラインに投入できるように
Sun Feb 8 00:01:47 JST 2015 (modified: Fri Sep 29 21:38:45 JST 2017)
views: 1649, keywords:プログラミング,GlueLang,寝る,日記,グルー言語を作る この記事は最終更新日が7年以上前のものです。
GlueLangが変態言語になるかどうかの瀬戸際である
本日は久々にGlueLangを作りこんでいました。読んでてもほとんどの人が分からんと思いますが作業日誌です。いや、読んでも分からんとか言ってたら絶対普及しないので、この前LTやったスライドを貼り付けときます。
ファイルや変数に直接文字列を指定可能に
今まではechoを書かないとファイルや文字列に文字が入って行きませんでしたが、要らなくなりました。
:GlueLang ueda$ cat fuge.glue
uedambpimport PATH
= 'abc'
file f = 'cde'
str s
cat f echo s
実行するとこの通りに機能します。
:GlueLang ueda$ ./glue fuge.glue
uedambp
abc cde
たぶん今後、Pythonみたいに文字列をいじれるように改良すると思います。こんなふうに。
= 'ab%sc%d' % 'hoge' 1234 file f
リテラルの文字列の改行に対応
ということは、ヒアドキュメントは不要ということで、こんなふうにAWKのコードを書くことができます。
:GlueLang ueda$ cat fuga.glue
uedambpimport PATH
= '
file code NF==2{print "素数",$2}
NF!=2{print "素数じゃねえ"}
'
seq 1 10 >>= gfactor >>= awk -f code
これでglue自体には文字列処理を実装する必要がないなーと思ったり思わなかったり。
一応実行しときます。
:GlueLang ueda$ ./glue fuga.glue
uedambp
素数じゃねえ2
素数 3
素数
素数じゃねえ5
素数
素数じゃねえ7
素数
素数じゃねえ
素数じゃねえ 素数じゃねえ
whereを使うとワンライナーにawkの長いコードをぶち込むことができます。しかしちょっと分かりにくいかなあ・・・
:GlueLang ueda$ cat fuge.glue
uedambpimport PATH
seq 1 10 >>= gfactor >>= awk -f awkcode
where file awkcode = '
NF==2{print "素数",$2}
NF!=2{print "素数じゃねえ"}
'
procをサブシェル化
変数やimportの情報を引き継げるようになりました。ということで、上のコード(fuge.glue)は次のように書き直すことができます。awkのパスが通ります。
:GlueLang ueda$ cat fuge.glue
uedambpimport PATH
= awk '
proc awkcode NF==2{print "素数",$2}
NF!=2{print "素数じゃねえ"}
'
seq 1 10 >>= gfactor >>= this.awkcode
最後に変態機能について。次のように文字列をパイプラインに送り込めるようにしました。
:GlueLang ueda$ cat hoge.glue
uedambpimport PATH
'abc
def>>= rev
ghi' ### 実行 ###
:GlueLang ueda$ ./glue hoge.glue
uedambp
cba
fed ihg
改行がちょっと格好悪いので、リストで渡すこともできます。ただ、単に改行でjoinして渡すだけなので、紛らわしいかもしれません。
:GlueLang ueda$ cat hoge2.glue
uedambpimport PATH
>>= rev
['abc','def','ghi'] ###結果は同じ###
:GlueLang ueda$ ./glue hoge2.glue
uedambp
cba
fed ihg
だんだん変態フレーバーが漂い始めたような気がしないでもない。
寝る。