if文の表現

Fri Mar 27 00:22:45 JST 2015 (modified: Sat Sep 30 16:15:34 JST 2017)
views: 1433, keywords:サブシェル,プログラミング,GlueLang,OR記号,研究 この記事は最終更新日が7年以上前のものです。

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

眠いです。

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文に相当する表現は次のようになりました。前回の

#!/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の開発についてこれてますかね???

あかん。孤立気味だ。

寝る。

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

prev:Structure and Interpretation of Computer Programs読書会29回目メモ書き next:シェル芸で部分集合を全通り求める方法(別解求む)

やり散らかし一覧

記事いろいろ