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

Sun Feb 8 00:01:47 JST 2015 (modified: Fri Sep 29 21:38:45 JST 2017)
views: 1448, keywords:プログラミング,GlueLang,寝る,日記,グルー言語を作る この記事は最終更新日が6年以上前のものです。

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

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

20150201 シェル芸勉強会LT GlueLangについて (シェル書いてますが何か?) from Ryuichi Ueda

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

今までは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

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

寝る。

ノート   このエントリーをはてなブックマークに追加 
 

prev:Structure and Interpretation of Computer Programs読書会28回目メモ書き next:日記(実験データ解析にGlueLang投入から慌ててwhileを実装)

やり散らかし一覧

記事いろいろ