ラベル scala の投稿を表示しています。 すべての投稿を表示
ラベル scala の投稿を表示しています。 すべての投稿を表示

2010/08/01

scala-2.8.0.final on Windows7 64bit

Windows7 64bit に scala-2.8.0.final を設定したのでログ残し。
  • まず、ここから scala-2.8.0.final.zip をダウンロード
  • ダウンロードした zip ファイルを C:\scala\scala-2.8.0.final として展開
  • 環境変数 JAVA_HOME が設定されていることを確認
  • 環境変数 JAVACMD に java を設定
  • 環境変数 SCALA_HOME をC:\scala\scala-2.8.0.finalに設定
  • 環境変数 PATH に %SCALA_HOME%\bin を追加
これで動く。

はずなんだが、環境によるとコマンドプロンプトで scala のREPLを起動させた場合、「java.exeの使い方が誤っています」というエラーメッセージが出る場合がある。
これは、OS が 64bit の場合に出るんだけど、原因は scala.bat の32行目と、JDKインストールされているディレクトリ。
if exist "%JAVA_HOME%\bin\java.exe" set _JAVACMD=%JAVA_HOME%\bin\java.exe
OS が 64bit で x86 用の Java をインストールしている場合、C:\Program Files(x86) 以下にインストールされている場合が多い(デフォルトだから)
この(x86)がクセモノで、丸括弧によってブロックと認識されてしまい、\Java\jdk1.6.0_xx\bin\java.exe だけ単独の命令として扱われてしまう。
対策としては、以下が考えられるかな。
  1. 64bit 用の JDK をインストールする
  2. 32bit 用の JDK だけど、丸括弧の含まれないパスにインストールする
  3. scala.bat と scalac.bat の問題の部分をコメントアウトする。ただし、%HAVA_HOME%\bin にパスが通っていること
ちなみに、俺は 1 でやった。
システム上の都合で、新規に JDK をインストールできないならば、3しかないかなぁ。
環境変数の遅延展開とか試してみたけど、どうも挙動がおかしい。

2010/02/09

コップ本読了

コップ本こと Scalaスケーラブルプログラミング を読み終えた。
とはいえ一応一回目を読み終えたというだけで、まだまだ理解が足りない。
Scala 入門も三回しか書いていないし。
これからじっくり、読み直し、写経して身につけていかないとな。

2010/02/04

Scala 入門3 - コンストラクタ追記

コンストラクタ宣言とともに、プロパティも宣言

class Hoge(val x:Int, val y:Int) {
  // implementations
}

基本のコンストラクタを隠蔽する

class Hoge(private x:Int, private y:Int) {
  // implementations
}

2010/01/28

Scala 入門2 - クラスとコンストラクタ

Scala でクラスを定義する。

class Test {
}
これだけ。

Scala はクラス定義と同時にコンストラクタを定義できる。

class Test(x:Int, y:Int, z:Int) {
  // 既存メソッドをオーバーライドするには override が必要
  override def toString = "x: " + x + ", y: " + y + ", z: " + z
}
val t = new Test(1, 2, 3)
println(t) // x: 1, y: 2, z: 3
ただし、これでは t.x のように外部からアクセスできない。
アクセスするために、引数をフィールドに保持する。(デフォルトでpublic)
class Test(x:Int, y:Int, z:Int) {
  val a = x
  val b = y
  val c = z
  override def toString = "a: " + a + ", b: " + b + ", c: " + c
}
val t = new Test(1, 2, 3)
println(t.a) // 1

コンストラクタのオーバーライドもできるよ。

class Test(x:Int, y:Int, z:Int) {
  val a = x
  val b = y
  val c = z
  def this(x:Int, y:Int) = this(x, y, 0)
  override def toString = "a: " + a + ", b: " + b + ", c: " + c
}
val t = new Test(1, 2)
println(t) // a: 1, b: 2, c: 0

でもこれはダメ。

class Test(x:Int, y:Int, z:Int) {
  var a = x
  var b = y
  var c = z
  def this(x:Int, y:Int) = {
    this.a = x
    this.b = y
    this.c = 0
  }
  override def toString = "a: " + a + ", b: " + b + ", c: " + c
}
val t = new Test(1, 2)
println(t)
// こんなコンパイルエラーが出る
//(fragment of test.scala):6: error: '(' expected but '.' found.
//    this.a = x
//         ^
コンストラクタをオーバーライドする場合、必ずクラス定義と同時に宣言したコンストラクタを最初に呼ばないといけない。
class Test(x:Int, y:Int, z:Int) {
  var a = x
  var b = y
  var c = z
  // こういうのはいい
  def this(x:Int, y:Int) = {
    this(x, y, 0)
    this.c = 1
  }
  override def toString = "a: " + a + ", b: " + b + ", c: " + c
}
val t = new Test(1, 2)
println(t) // a: 1, b: 2, c: 1
これも大丈夫(間接的に呼び出しているため)
class Test(x:Int, y:Int, z:Int) {
  val a = x
  val b = y
  val c = z
  def this(x:Int, y:Int) = this(x, y, 0)
  def this(x:Int) = this(x, 0)
  override def toString = "a: " + a + ", b: " + b + ", c: " + c
}
val t = new Test(1)
println(t) // a: 1, b: 0, c: 0

2010/01/24

vim に scala 用の設定を行う

まず、scala.vim を取得し、~/.vim/syntax に配置する。
次に scala ファイルに対して適応させるため、 ~/.vim/filetype.vim に(なければ作成)こちら の設定を行う。
とりあえずこれで大丈夫なのだが、タブが4スペース分になってしまう。
参考書では2スペースなので、それに従っておく。
~/.vim/ftplugin に scala.vim を作成し、下記を記述。
" vim: nowrap sw=2 sts=2 ts=8 ff=unix:
set expandtab
set tabstop=2 shiftwidth=2 softtabstop=2
set autoindent
set fileencoding=utf-8
set encoding=utf-8
set fileformat=unix

これでとりあえずはいいかな。

2010/01/23

Scala 始めました

Scala なる言語がおもしろそうなのでやってみる。
Scalaスケーラブルプログラミング にてお勉強。
まだ、1章と2章しか読めてないけど。
そろそろ実際に打ち込んで勉強していかないとな。
とりあえず、lift でなんか作れるぐらいまでがんばろう。