式と文
最近、HaskellとGaucheで関数型言語を勉強している。もう少し理解が進んできたら関数型言語の概念を一般化してまとめてみたいと思っているが、式と文に関して気がついたことを書いておく。書籍『プログラミングGauche』に載っているコラム「すべて式である」を参考にした。
まず、すべてを式にするためには以下のものを式として扱えるようにする必要がある。
- ブロック
- if、forなどの制御構造
- 代入
- 例外処理など
Gaucheではシンボルやリテラルをアトムと言い、もちろん式として扱える。複数の式を集めたものをリストと言い、ブロックの代わりとなる。
ifは式であるし、forやwhileなどのループは再帰として書ける。Schemeでは代入を行う手続きが使えるようになっているらしいが、2008/3/15の日記に書いたように、もちろん代入ができなくても状態を遷移すれば状態を管理できる。
Pythonと比較して考えてみると、ブロックを式として扱えるのと、まともなif式が入れば、全てを式として扱えるかもしれない。しかし、やはりRubyみたいに代入も式として扱えるようにしてもらわないと不便。Pythonの方針は間違いを起こしにくいという意味では正解だと思うが、自由度が奪われる。両者をうまく組み合わせた言語は存在するのだろうか?Scalaはどうなのだろう?