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

2012年6月3日日曜日

scala.sys.Processのシンタックスシュガーでコンパイルエラー

簡単な運用スクリプトをscala移行をおこなっていて、ちょっと悩み中。
scala.sys.Processを使っていて、下記のようなコードを書きました。
import scala.sys.process._
val result ="df -k"!!
println(result)

コンパイルしてみると、
> compile
[info] Compiling 1 Scala source to /Users/kazuhiro/work/scala/sbt_project/sample_project/target/scala-2.9.0-1/classes...
[error] /Users/kazuhiro/work/scala/sbt_project/sample_project/src/main/scala/Sample.scala:28: recursive value result needs type
[error]  println(result)
[error]          ^
[error] /Users/kazuhiro/work/scala/sbt_project/sample_project/src/main/scala/Sample.scala:28: type mismatch;
[error]  found   : Unit
[error]  required: scala.sys.process.ProcessLogger
[error]  println(result)
[error]         ^
[error] two errors found
[error] {file:/Users/kazuhiro/work/scala/sbt_project/sample_project/}default-fc0f5b/compile:compile: Compilation failed
[error] Total time: 2 s, completed 2012/06/02 11:22:44
次に以下のように!!の行に一行あけてみると。
import scala.sys.process._
val result ="df -k"!!

println(result)
コンパイルが問題なく通る。 シンタックスシュガーに改行が必要だとシンタックスシュガーにならんじゃないの? REPLで上記コードを入力した場合は、問題なく実行されるので、本来ならば問題はないんだろうなぁ。。 環境は
mac OS X 10.7.4
scala-2.9.0-1
追記:2012/06/05

とりあえず謎の空行の対策としては、セミコロンを入れればコンパイルエラーはなくなる事が判明。 うぅーん。なぞだ。

2011年9月2日金曜日

SBTを使い始める

とりあえず、sbtを使ってみるということで、インストールログを簡単に。

> curl -O http://simple-build-tool.googlecode.com/files/sbt-launch-0.7.7.jar
※
> wget http://simple-build-tool.googlecode.com/files/sbt-launch-0.7.7.jar
> ln -s sbt-launch-0.7.7.jar sbt-launch.jar
> vi  sbt
> java -Xmx512M -jar `dirname $0`/sbt-launch.jar "$@"
> chmod +x sbt
> ./sbt
kaz@earlgray:~/work/scala/sbt> ./sbt 
Project does not exist, create new project? (y/N/s) y
Name: SampleProject
Organization: ponta
Version [1.0]: 
Scala version [2.9.0]: 
sbt version [0.7.7]: 

ヘルプの内容

ヘルプ 内容
actions Shows all available actions
reload Reloads sbt, picking up modifications to sbt.version or scala.version and recompiling modified project definitions
current Shows the current project, Scala version, and logging level.
trace 'on', 'nosbt', 'off', or <integer> Configures stack trace logging. 'nosbt' prints stack traces up to the first sbt frame. An integer gives the number of frames to show per exception.
project <project name> Sets the currently active project. Use 'project /' to change to the root project or 'project ..' to change to the parent project.
projects Shows all available projects.
exit, quit Terminates the build.
set <property> <value> Sets the value of the property given as its argument.
get <property> Gets the value of the property given as its argument.
console-project Enters the Scala interpreter with the current project definition bound to the variable 'current' and all members imported.
builder Set the current project to be the project definition builder.


以下はプロジェクト作成時のログ


Getting net.java.dev.jna jna 3.2.3 ...
:: retrieving :: org.scala-tools.sbt#boot-app
confs: [default]
1 artifacts copied, 0 already retrieved (838kB/32ms)
Getting Scala 2.7.7 ...
:: retrieving :: org.scala-tools.sbt#boot-scala
confs: [default]
2 artifacts copied, 0 already retrieved (9911kB/54ms)
Getting org.scala-tools.sbt sbt_2.7.7 0.7.7 ...
downloading http://databinder.net/repo/org.scala-tools.sbt/sbt_2.7.7/0.7.7/jars/sbt_2.7.7.jar ...
[SUCCESSFUL ] org.scala-tools.sbt#sbt_2.7.7;0.7.7!sbt_2.7.7.jar (3128ms)
downloading http://databinder.net/repo/org.scala-tools.sbt/launcher-interface/0.7.7/jars/launcher-interface.jar ...
[SUCCESSFUL ] org.scala-tools.sbt#launcher-interface;0.7.7!launcher-interface.jar (336ms)
downloading http://databinder.net/repo/org.scala-tools.sbt/compile_2.7.7/0.7.7/jars/compile_2.7.7.jar ...
[SUCCESSFUL ] org.scala-tools.sbt#compile_2.7.7;0.7.7!compile_2.7.7.jar (342ms)
downloading http://databinder.net/repo/org.scala-tools.sbt/interface/0.7.7/jars/interface.jar ...
[SUCCESSFUL ] org.scala-tools.sbt#interface;0.7.7!interface.jar (341ms)
downloading http://databinder.net/repo/org.scala-tools.sbt/ivy_2.7.7/0.7.7/jars/ivy_2.7.7.jar ...
[SUCCESSFUL ] org.scala-tools.sbt#ivy_2.7.7;0.7.7!ivy_2.7.7.jar (515ms)
downloading http://databinder.net/repo/org.scala-tools.sbt/io_2.7.7/0.7.7/jars/io_2.7.7.jar ...
[SUCCESSFUL ] org.scala-tools.sbt#io_2.7.7;0.7.7!io_2.7.7.jar (352ms)
downloading http://databinder.net/repo/org.scala-tools.sbt/classpath_2.7.7/0.7.7/jars/classpath_2.7.7.jar ...
[SUCCESSFUL ] org.scala-tools.sbt#classpath_2.7.7;0.7.7!classpath_2.7.7.jar (333ms)
downloading http://databinder.net/repo/org.scala-tools.sbt/compiler-interface/0.7.7/jars/compiler-interface-bin.jar ...
[SUCCESSFUL ] org.scala-tools.sbt#compiler-interface;0.7.7!compiler-interface-bin.jar (344ms)
downloading http://databinder.net/repo/org.scala-tools.sbt/compiler-interface/0.7.7/jars/compiler-interface-src.jar ...
[SUCCESSFUL ] org.scala-tools.sbt#compiler-interface;0.7.7!compiler-interface-src.jar (335ms)
downloading http://databinder.net/repo/org.scala-tools.sbt/control_2.7.7/0.7.7/jars/control_2.7.7.jar ...
[SUCCESSFUL ] org.scala-tools.sbt#control_2.7.7;0.7.7!control_2.7.7.jar (336ms)
downloading http://databinder.net/repo/org.scala-tools.sbt/precompiled-2.8.1_2.8.1/0.7.7/jars/compiler-interface-bin.jar ...
[SUCCESSFUL ] org.scala-tools.sbt#precompiled-2.8.1_2.8.1;0.7.7!compiler-interface-bin.jar (344ms)
downloading http://databinder.net/repo/org.scala-tools.sbt/precompiled-2.9.0_2.9.0/0.7.7/jars/compiler-interface-bin.jar ...
[SUCCESSFUL ] org.scala-tools.sbt#precompiled-2.9.0_2.9.0;0.7.7!compiler-interface-bin.jar (346ms)
downloading http://databinder.net/repo/org.scala-tools.sbt/precompiled-2.8.0_2.8.0/0.7.7/jars/compiler-interface-bin.jar ...
[SUCCESSFUL ] org.scala-tools.sbt#precompiled-2.8.0_2.8.0;0.7.7!compiler-interface-bin.jar (345ms)
:: retrieving :: org.scala-tools.sbt#boot-app
confs: [default]
17 artifacts copied, 0 already retrieved (4379kB/58ms)
[success] Successfully initialized directory structure.
Getting Scala 2.9.0 ...
downloading http://repo1.maven.org/maven2/org/scala-lang/scala-compiler/2.9.0/scala-compiler-2.9.0.jar ...
[SUCCESSFUL ] org.scala-lang#scala-compiler;2.9.0!scala-compiler.jar (15211ms)
downloading http://repo1.maven.org/maven2/org/scala-lang/scala-library/2.9.0/scala-library-2.9.0.jar ...
[SUCCESSFUL ] org.scala-lang#scala-library;2.9.0!scala-library.jar (6277ms)
downloading http://repo1.maven.org/maven2/org/scala-lang/jline/2.9.0/jline-2.9.0.jar ...
[SUCCESSFUL ] org.scala-lang#jline;2.9.0!jline.jar (199ms)
downloading http://repo1.maven.org/maven2/org/fusesource/jansi/jansi/1.4/jansi-1.4.jar ...
[SUCCESSFUL ] org.fusesource.jansi#jansi;1.4!jansi.jar (244ms)
:: retrieving :: org.scala-tools.sbt#boot-scala
confs: [default]
4 artifacts copied, 0 already retrieved (20442kB/83ms)
[info] Building project SampleProject 1.0 against Scala 2.9.0
[info]    using sbt.DefaultProject with sbt 0.7.7 and Scala 2.7.7

2011年8月31日水曜日

Scalaの変位


不変、共変と反変について。Scalaプログラミング入門のP.218について


  • Javaのクラスの配列は共変
  • あるクラスの配列を引数として、宣言している場合、サブクラスの配列を引数として渡せる。String[] をObject[]を代入可能
  • Javaのジェネリクスは共変ではなく、不変List<string> はList<Object>に代入できない。 Javaのクラスの配列は共変となっているが、型の安全性をコンパイル時に保証してくれない。

Scalaでは不変、共変、反変について指定することが可能

  • 不変:[T]
  • 共変:[+T]
  • 反変:[-T]

不変

ScalaではArray[T]は不変です。foo(a:Array[String])メソッドに渡せるのはArray[String]のみです。
ミュータブルの場合に、型引数を不変にすることが望ましい。

class Holder[T](var data: T)
    def add(in: Holder[Int]) { in.data = in.data + 1 }
    val h = new Holder(0)
    add(h)
    println(h.data)

Holder[Number]はDoubleも保持できます。

val nh = new Holder[Number](33.3d)
    def round(in: Holder[Number]) { in.data = in.data.intValue }
    println(round(nh))
    println(nh.data.getClass)

    val dh = new Holder(33.3d)
    round(dh)   &lt;--コンパイルエラー

共変

共変にする場合には、型引数の前に+をつける。
共変の型引数は読み取り専用のコンテナに便利
List[+T]と定義して、List[String]をList[Any]を引数としてメソッドに引数として渡すので、
Listのすべての要素はAnyである要件を満たしているため、Listは共変となります。Listの内容は変更できません。

サンプル

    class Getable[+T](val data: T)
    def get(in: Getable[Any]) { println("It's " + in.data) }
    val gs = new Getable("String")
    get(gs)

    def getNum(in: Getable[Number]) = in.data.intValue
    import java.lang.{ Double => JDouble }
    val gd = new Getable(new JDouble(33.3))
    println(getNum(gd))    
つまり、Getable[+T]で定義したときGetable[String]をGetable[Any]に代入することができる。
子クラスの型に対して親クラスの型に代入することができる。

反変

Putable[String]を引数とするメソッドに対してPutable[AnyRef]を渡して呼び出せます。
    class Putable[-T] {
      def put(in: T) { println("Putting " + in) }
    }
    def writeOnly(in: Putable[String]) { in.put("Hello") }
    val p = new Putable[AnyRef]
    writeOnly(p)
    //
    trait DS[-In, +Out] { def apply(i: In): Out }
    val t1 = new DS[Any, Int] { def apply(i: Any) = i.toString.toInt }
    def check(in: DS[String, Any]) = in("333")
    println(check(t1))


Putable[-T]で定義したときにPutable[AnyRef]をPutable[String]に代入
反変は共変の反対で親クラスの型に対して、子クラスの型に代入することができる。

変位ルール

  • ミュータブルなコンテナは不変
  • イミュータブルなコンテナは共変[+T]
  • 変換処理の入力は反変[-T]に、出力は共変[+T]

ScalaのFunctionNトレイトは反変の引数と共変の戻り値を持っている。


2011年8月12日金曜日

VisualStudioでScala

Scala comes to .NET
にも記述されていますが、Visual Studioでscala開発が可能になるとこのこと。
まぁ、C#,F#とかJVMになっているし、あり得る方向なのかなぁ。。。。
microsoft にもscalaの有用性があると認識されたということだな。

リンク先の翻訳は時間があれば


2010年7月24日土曜日

scalaについてちょっと学んでみる

先日オブジェクト倶楽部というイベントに行ってきまして、イベントの懇親会の最後に
いろんな本のプレゼントというのがあり、ついついscala本を手に取ってしまいました。

事前の知識としてはscalaは
・オブジェクト指向&VMで動作
・Javaとの互換あり
・関数型言語

しかありませんでした。でも会社の後輩が興味もって本を買っていた
のでちょこっと興味がそそられてしまって持って帰りました。


面白そうと思ったところ

・XMLを直接プログラム内部に記述が可能
・クロージャ
・インタプリタかつコンパイラ
・並列処理が強そう(Actor)。まぁ、Scalaの語源となったスケーラビリティの思想だもんなぁ
http://ja.wikipedia.org/wiki/%E3%82%A2%E3%82%AF%E3%82%BF%E3%83%BC%E3%83%A2%E3%83%87%E3%83%AB

気になった点
・Javaと文法が結構異なる。
  groovyみたいにほとんど同じでも記述できますだと移行が簡単だが、これはJavaからの移行は考えられていなさそう。


でも非常に楽しそうな言語ではあるが、自分の業界に完全にアンマッチだろうなぁ。。。