GlueLangのif文相当の処理をまたいじったがこれで最後にしたい

Pocket
LINEで送る

眠いです。

GlueLangのif文及びその周辺、またいじりました。

やっぱり波括弧やめた

前回、複合コマンドをこんなふうに書くようにしましたが・・・

uedambp:SRC ueda$ cat hoge 
#!/usr/local/bin/glue
import PATH

{
	echo 'abc'
	echo 'def'
} >>= rev
uedambp:SRC ueda$ ./hoge 
cba
fed

こうしました。やっぱりHaskell, Python系の書き方にしようとしているのに波括弧はあまり合わんという判断。波括弧が最終行の最後にあったら認識しないようになってましたし・・・(アカン)。doの次の行からがサブシェル扱いされます。最初の行のインデントがオフサイドラインになります。

uedambp:GlueLang ueda$ cat huge.glue 
#!/usr/local/bin/glue
import PATH

do
	echo 'abc'
	echo 'def'
>>= rev
uedambp:GlueLang ueda$ ./huge.glue 
cba
fed

procにもdoが必要に

これに伴い、procで2行以上書くときにもdoが必要ということにしました。イコールの後に一行で書くときは不要です。

uedambp:GlueLang ueda$ cat hoge.glue 
#!/usr/local/bin/glue
import PATH

proc hoge = do
	echo 'abc'
	echo 'def'

hoge >>= rev
uedambp:GlueLang ueda$ ./hoge.glue 
cba
fed

if文の表現

んで、最終的にif文に相当する表現は次のようになりました。前回の

#!/usr/local/bin/glue
import PATH

{
	false
	echo 'hoge'
} !> {
	echo 'foo'
} !> {
	echo 'bar'
}

は、

uedambp:GlueLang ueda$ cat hoge.glue 
#!/usr/local/bin/glue
import PATH

do
	false
	echo 'hoge'
!> do
	echo 'foo'
!> do
	echo 'bar'

となりました。

ただ、この書き方だと前回言ったようにサブシェル内のコマンドが全て条件文になってしまう(if文というよりもtryみたいになる)ので、ちゃんと条件と条件が満たされたときに実行される部分を分けたいときは、

uedambp:GlueLang ueda$ cat if1.glue 
#!/usr/local/bin/glue
import PATH

test 1 -eq 2 ? do
	echo 'first subshell'
	echo '1 = 2'
!> test 1 -eq 1 ? do
	echo 'second subshell'
	echo '1 = 1'
!> echo 'third command'
###実行###
uedambp:GlueLang ueda$ ./if1.glue 
second subshell
1 = 1

と書いてもらうことにしました。?の左側に条件、右側に条件がtrueのときに実行される部分を書きます。別にサブシェルを使う必要のないときは、

uedambp:GlueLang ueda$ cat if2.glue 
#!/usr/local/bin/glue
import PATH

test 1 -eq 2    ?  echo '1 = 2'
!> test 1 -eq 1 ?  echo '1 = 1'
!> echo 'third command'

となります。ちょっとスッキリしませんが、if文自体あんまり使うことは無いはずなので、これでよしとしたいです。

実は「?」は、「!>, >>, >>=」と同じグループの演算子なので基本的にこれはif文でなくコマンドを接続しているだけです。ですので、

uedambp:GlueLang ueda$ cat if3.glue 
#!/usr/local/bin/glue
import PATH

test 1 -eq 2 ? echo '1 = 2' !> test 1 -eq 1 ? echo '1 = 1' !> echo 'third command'

と書いても動きますが、さすがにインデント入れないと可読性皆無になりますね。

ところで、だれかGlueLangの開発についてこれてますかね???

あかん。孤立気味だ。

寝る。

Pocket
LINEで送る

GlueLangのif文相当の処理をガラッと変えてみた

Pocket
LINEで送る

今日は息抜きにGlueLangをいじっておりました。といっても言語の開発なので、処理系のバグと、スクリプトのバグの両方に気をつけなければならず、なかなかイライラするものですが・・・

機能追加1: 複合コマンド

続きを読む GlueLangのif文相当の処理をガラッと変えてみた

Pocket
LINEで送る

bashで中括弧のグループコマンドをパイプでつなぐとサブシェルで実行されるので一応気をつける

Pocket
LINEで送る

どうも。寝不足太郎上田です。細かい話が嫌いなのですが、調べる必要があり、調べたことを書きます。

{}で囲ったグループコマンドについてはシェルスクリプト本体と同じプロセスで動作するという記述がmanにあります。

ueda@remote:~$ man bash
...
       { list; }
              list is simply executed in the current shell environment.  
...

続きを読む bashで中括弧のグループコマンドをパイプでつなぐとサブシェルで実行されるので一応気をつける

Pocket
LINEで送る