式と文
最近、HaskellとGaucheで関数型言語を勉強している。もう少し理解が進んできたら関数型言語の概念を一般化してまとめてみたいと思っているが、式と文に関して気がついたことを書いておく。書籍『プログラミングGauche』に載っているコラム「すべて式である」を参考にした。
まず、すべてを式にするためには以下のものを式として扱えるようにする必要がある。
- ブロック
- if、forなどの制御構造
- 代入
- 例外処理など
Gaucheではシンボルやリテラルをアトムと言い、もちろん式として扱える。複数の式を集めたものをリストと言い、ブロックの代わりとなる。
ifは式であるし、forやwhileなどのループは再帰として書ける。Schemeでは代入を行う手続きが使えるようになっているらしいが、2008/3/15の日記に書いたように、もちろん代入ができなくても状態を遷移すれば状態を管理できる。
Pythonと比較して考えてみると、ブロックを式として扱えるのと、まともなif式が入れば、全てを式として扱えるかもしれない。しかし、やはりRubyみたいに代入も式として扱えるようにしてもらわないと不便。Pythonの方針は間違いを起こしにくいという意味では正解だと思うが、自由度が奪われる。両者をうまく組み合わせた言語は存在するのだろうか?Scalaはどうなのだろう?
関数型言語の特徴
何が入っていれば関数型言語と言えるのか気になっている。Wikipediaによれば、関数型言語は以下のもの。
ラムダ計算の概念をプログラミング言語として体現したものである。すべての計算は関数の評価によって行われる。
HaskellやOCamlでは、本質的に引数が1つしか取れないが、Gaucheはそうなっていない。しかし、この機能があると関数型ではかなり応用範囲が広がる。Gaucheでは、その辺をどうしているのか気になる。
先輩は、Schemeは低レベルな言語であると言っていた。低レベルで色々深いことができると思うが、パターンマッチなど結構高級な機能もあると思うので、そのバランスが面白いのではないかと思う。ある意味、低レベルと高レベルの両者をカバーしている?
最近気になる書籍
- 『ビューティフルコード』
- 『Jythonプログラミング』
- 『ジェネレーティブプログラミング』
上の2冊は購入する可能性が高い。『ビューティフルコード』の方はPythonの記事が含まれていたので購買意欲がわいた。Jython本は、最近ScalaのせいでJavaに興味あるので購入しようかと思う。
それにしても自分みたいに実用性を求める人間としては、Pythonという最強な言語を超える言語は今のところ存在しないと思っているのだが、最近物足りなさは感じる。次は、Scalaになるのか何になるのか気になる。Pythonよりも関数型に近いからという理由だけでは、Rubyに行くことはないと思う。Rubyが今ひとつ、ぐっとくるものがないと感じるのは何故だろう?Pythonとかぶっているから?