ScalaからGroovyへ

昨日前の会社の先輩からGroovyという言語を教えてもらった。以下Wikipedia(http://ja.wikipedia.org/wiki/Groovy)からの引用。

その他、Python、…などからも言語機能が取り込まれている。

Groovyではコードブロックをファーストクラス(一級市民)オブジェクトとして生成し、変数に格納したりメソッド引数や戻り値として受け渡したりすることができる。

Groovyならできるじゃないか!


以下Groovyで作成したコードをjavaコマンドで実行する方法のメモ。知らなかったけどscalaでもjavaコマンドで実行できるらしい。やり方はGroovyとほぼ同じ。

手順0) Test.groovyファイルを作成して中身を記述する
手順1) groovycコマンドでclassファイルにコンパイル
       groovyc Test.groovy
手順2) カレントとembeddableフォルダのjarファイルにクラスパスを通して実行
       java -cp .;C:\groovy-1.6\embeddable\groovy-all-1.6-beta-1.jar Test

groovyshやgroovyConsoleというPythonインタラクティブシェルのようなものも付属している。また、groovyコマンドでソースから実行することもできるし、ビルドしたものから実行することもできる。


Scalaは複雑すぎるのだよなあ。プログラミング言語におけるsimplicityは重要かも。とりあえずもう少しさわってみよう。

関数型言語の考え方

以下は私のHaskellなどの関数型言語に対する理解。先日リンクしたHaskellのPPTを見てイメージできた。私は関数型に関して素人なので間違いを含むかも。

  • for, whileなどのループの制御文は、内部イテレータな「高階関数」は内部に再帰を含んでいると思われるので、突き詰めていくと「再帰」と「リスト内包表記」の2通りしかないと思われる。分類した方が分かり易ければ「高階関数」、「再帰」、「リスト内包表記」の3パータンに分類できる(他にあるのかな?)
  • 関数型言語の最大の特徴は、リストが特別なデータ構造になっているところだと思う。つまり、リストは「先頭要素」と「残りのリスト」のペアのポインタを持ち、「残りのリスト」はさらに「先頭要素」と「さらに残りのリスト」のペアのポインタを持つという再帰的な構造になっている
  • そして、そういう構造なので(あえてそういう構造にしているので)再帰処理がしやすい、無限リストが扱いやすいという特徴を持つ
  • そして、無限リストを扱うと無限に評価してしまわないように遅延評価が必要になる
  • そして、遅延評価をすると評価順が直観(正格評価の方が経験上直観に近い?)と異なるので、評価順が違えば状態を評価する順番により結果値が異なるので、状態を変更できないという参照透明性?が必要になる
  • そして、IOなど副作用を持った処理や呼び出した順(正格評価順?)に処理を行いたい場合として、例外的にモナドという考え方を導入する


他の項目は少しずつ勉強するつもり。それにしてもSchemeとかHaskellとか関数型言語は構文が直観的でないとか見やすくないものが多くすぐ忘れてしまう…。