MacとLinuxのパスの違いも吸収できるようにした
Sat Jan 17 14:10:02 JST 2015 (modified: Fri Sep 29 21:38:45 JST 2017)
views: 1641, keywords:プログラミング,GlueLang,where,グルー言語を作る この記事は最終更新日が7年以上前のものです。
GlueLangでとうとうwhereが使えるように
週末プログラマー上田Zです。(きもちわるい)
どうしても実装したかったwhereを本日ついに実装しました。まだスコープが分かれてませんが。
whereの使い方
例えばシェルスクリプトでこう書いたとします。ファイルaとbを作って、diffで比べています。
seq 8 > a
seq 10 > b
diff a b
しかし、aとbをdiffでしか使わないとしたら、aとbをdiffのためだけに作っているようにコードを見せたほうがよいということで、Glueでは次のように書けます。
import PATH
? diff a b
where file a = seq 8
= seq 10 file b
これならコードの他の部分を読んでいるときに目障りなaとbが視界に入りません(いや、右目にちょっと入るが・・・)。まだ実装してませんが、名前もローカルで定義でき、diffの処理が終わったらaとbの実体(中間ファイル)を消すこともでき、事故も減ります。ローカルスコープにするのも中間ファイルを消すのもまだ実装してませんが・・・。
ちなみにdiffの頭につけた?(if)は、diffが0でない終了ステータスを返してもスクリプトが終了しないためのズルです。
環境変数PATHも使えるようにした
そして、上の例でも使いましたが、「import PATH」と書くと環境変数のパスを全部読み込んでくれるようにしました。
import PATH
echo 'もうフルパス指定もprefixも不要。' echo 'ただ、指定して書いたほうが厳密なので指定した方がいいかも。'
もう一つimportの規制緩和ですが、異なるパスに同じprefixをつけることができるようになりました。例えばawkはMacだと/usr/local/bin/、Linuxだと/usr/bin/にありますが、次のように書いておけばどっちでも動きます。
import /usr/local/bin/ as sys
import /usr/bin/ as sys
.awk 'BEGIN{print "hoge"}' sys
ようやく言語っぽくなってきました。