GlueLangが変態言語になるかどうかの瀬戸際である

Pocket
LINEで送る

本日は久々にGlueLangを作りこんでいました。読んでてもほとんどの人が分からんと思いますが作業日誌です。いや、読んでも分からんとか言ってたら絶対普及しないので、この前LTやったスライドを貼り付けときます。

ファイルや変数に直接文字列を指定可能に

今まではechoを書かないとファイルや文字列に文字が入って行きませんでしたが、要らなくなりました。

uedambp:GlueLang ueda$ cat fuge.glue 
import PATH

file f = 'abc'
str s = 'cde'

cat f
echo s

実行するとこの通りに機能します。

uedambp:GlueLang ueda$ ./glue fuge.glue 
abc
cde

たぶん今後、Pythonみたいに文字列をいじれるように改良すると思います。こんなふうに。

file f = 'ab%sc%d' % 'hoge' 1234

リテラルの文字列の改行に対応

ということは、ヒアドキュメントは不要ということで、こんなふうにAWKのコードを書くことができます。

uedambp:GlueLang ueda$ cat fuga.glue 
import PATH

file code = '
	NF==2{print "素数",$2}
	NF!=2{print "素数じゃねえ"}
'

seq 1 10 >>= gfactor >>= awk -f code

これでglue自体には文字列処理を実装する必要がないなーと思ったり思わなかったり。

一応実行しときます。

uedambp:GlueLang ueda$ ./glue fuga.glue 
素数じゃねえ
素数 2
素数 3
素数じゃねえ
素数 5
素数じゃねえ
素数 7
素数じゃねえ
素数じゃねえ
素数じゃねえ

whereを使うとワンライナーにawkの長いコードをぶち込むことができます。しかしちょっと分かりにくいかなあ・・・

uedambp:GlueLang ueda$ cat fuge.glue 
import PATH

seq 1 10 >>= gfactor >>= awk -f awkcode
	where file awkcode = '
		NF==2{print "素数",$2}
		NF!=2{print "素数じゃねえ"}
		'

procをサブシェル化

変数やimportの情報を引き継げるようになりました。ということで、上のコード(fuge.glue)は次のように書き直すことができます。awkのパスが通ります。

uedambp:GlueLang ueda$ cat fuge.glue 
import PATH

proc awkcode = awk '
	NF==2{print "素数",$2}
	NF!=2{print "素数じゃねえ"}
	'

seq 1 10 >>= gfactor >>= this.awkcode

文字列をそのままパイプラインに投入できるように

最後に変態機能について。次のように文字列をパイプラインに送り込めるようにしました。

uedambp:GlueLang ueda$ cat hoge.glue 
import PATH

'abc
def
ghi' >>= rev
### 実行 ###
uedambp:GlueLang ueda$ ./glue hoge.glue 
cba
fed
ihg

改行がちょっと格好悪いので、リストで渡すこともできます。ただ、単に改行でjoinして渡すだけなので、紛らわしいかもしれません。

uedambp:GlueLang ueda$ cat hoge2.glue 
import PATH

['abc','def','ghi'] >>= rev
###結果は同じ###
uedambp:GlueLang ueda$ ./glue hoge2.glue 
cba
fed
ihg

だんだん変態フレーバーが漂い始めたような気がしないでもない。

寝る。

Pocket
LINEで送る