Scalaを勉強した結果、今日のNode.js初級入門勉強会でcoffee-scriptが書けるようになってた。coffee気持ち悪いと思ってたけど苦手克服できてよかった。


Java/JRuby/Scala

ScalaはJava。JRubyはRuby。
ScalaはJavaのシンタックスをシンプルに直して、Java使ってて不満な文字列、正規表現、配列やMap、無名関数や高階関数などの機能を追加した、より良いJavaという印象。
JRubyはRubyがJVM上で動いていて、ついでにJavaの機能も使える言語だと思う。

JRubyと比べると、JRubyよりもJavaに寄っている気がする。Javaのライブラリをスクリプト言語から使いたい時は今後はscala使おうと思う。

Scalaは型宣言をしなければならないのが良い。JRubyの方がRubyに寄っていて、スクリプト言語としての使い勝手はRubyの方が良いと思うけど、型がRubyの型なのかJavaの型なのかよくわからなくなって辛かった。
もちろんJVM上でRailsアプリを書くみたいな、Javaの機能は使わないでRubyだけでやるならJRubyは問題ないと思う。

スクリプト言語としての書き心地はRubyの方が好みだけど、スクリプト言語からJavaを使いたいならScalaの方がいい。


インストール

brew install scala
scala -version

scalaコマンドでインタラクティブシェルが起動して、適当に書いてtabを押せばメソッド名一覧とかでてくる。
おかげで特に本とか読まずにいきなりコード書ける。


練習問題

研究室のwikiにスクリプト言語の便利な機能を使わざるを得ないRubyの初級問題集がある。


“abracadabra” などに “a” がいくつあるか数える

正規表現を使う。String.rでRegexpになる。メソッドチェインでつないでいける。
: の後ろが型。


「また大阪か」を「ま た 大 阪 か」に変換する

いったん文字列を配列に分解してから結合し直す
return書かなくてもいい。


フィボナッチ数列をどんどん生成する

無名関数をコールバック関数として登録するようにした。
defじゃなくてvalに関数オブジェクトを保存するようにしてみた。valは定数でvarは再代入可能な変数。
普通のArrayは中身をいじれないので、mutable.ListBufferかmutalbe.ArrayBufferを使う。
配列の添字が[]ではなく()だった。Unitはvoidの事。
BigIntを使ったら9223372036854775807桁まで数値計算できた。


最大公約数を求める

可変長引数を使って、引数を何個でも取れるようにした。
<-はrange。大きい数から試行したくてRange.reverseしてみたらちゃんと動いてくれてうれしかった。
Arrayにminやmaxといったメソッドがあって楽だった。
map,filter,forallなんかも良い。


fizzbuzz

scalaは型が固いのがいいのだけど、文字列と数値どちらも渡せる関数を作りたい時もある。
Any型を使えばどんな型でも渡せる。


「ゎたしはっらぃょ」のように、小さい平仮名に変換しろ

argvで実行時引数が取れる。Mapも機能が豊富で使いやすかった。
三項演算子はないけどif elseで同じ事ができる。


素因数分解

末尾再帰の結果をlistで巻き戻して返す。
Scalaコレクションメソッドメモ(Hishidama's Scala collection method Memo)を見たら、四則演算子でlist同士を連結したり色々と操作する機能が充実してた。