Scala Study Session4. Scalaとのであい
、、、,. ,._ >>Scalaくん…… Scalaくん………
ィ`‘′ ヽ
〃/ノノ八レレ、. | Scalaくんに託すっ…!
ル三’‘′`三ヽ. |
[ ≧|ニ|≦_]~|^)ト、 虫のいい話なんだが……
. | ,-L__」 -、u |ト:| |’‘‐- ...__
_.. -┬|l王l王l王l`/ .| | | Haskellの代わりに…
. ∧ |├‐┬─‐’‘′/ || ぼくをきたえあげて……
/ l |.l-―|、___/-―┤
| ̄ ̄|.| | | ヽ. / | | 関数型をわからせてやってくれ…
/.| | l. | | Y。 ||
\/~三三..l | ̄ ̄ ̄ ̄ ̄  ̄| たのむ……
/、 丁` /ヽ「| /.| |
. / へ、./ | l. /⊿ |_ |
/ |/ | |. └‐::┐r‐┘ .|
. ! / |_|. └' |==
10. Scalaの実装
ゆえに(?)Java Scalaの相互呼び出しが可能
object ScalaToJavaCallSample extends Application {
def method = println(quot;Hello, Scala!quot;)
new JavaToScalaCallSample().method()
}
public class JavaToScalaCallSample {
public void method() {
System.out.println(quot;Hello, Java!quot;);
}
public static void main (String[] args) {
ScalaToJavaCallSample.method();
}
}
13. Scalaの捉え方
1. OO言語としてのScala
2. 関数型言語としてのScala
3. 並列処理基盤としてのScala
19. 記法の簡略化
例:クラス定義(Java)
public class Foo {
private String name;
public Foo(String name) {
this.name = name
}
public void setName(String name) {
this.name = name
}
public String name() {
return name
}
}
21. objectの導入
要するに「Singletonなclass」
staticの代替と考えてもおk
コンパイル後には実際、static+Singletonクラスに
object HelloWorld extends Application {
println(“Hello, World!”)
}
classとは異なる名前空間を持つ
Scalaライブラリの中で、classと同名のFactoryとして
リテラルの拡張のような形で使われている
val list : List = List(1, 2, 3, 4, 5)
23. Mix-in
Traitの例
trait HelloTrait {
val msg = quot;Hello, World!quot;
def say {
println(msg)
}
}
class SimpleClass extends HelloTrait
new SimpleClass().say
24. Mix-Inの正体
コンパイラは、このようなバイトコードを生成
class A extends B { trait B {
def method {…
class A implements B { 実装 interface B {
public void method();
public void method { abstract class B$class {
B$class.method(); public static void method {
} 委譲
println(“hello, world!”);
}
26. 型推論
もうちょい凝った例:
def dup[T](x: T, n: Int): List[T] =
if (n == 0) Nil else x :: dup(x, n - 1)
推測
dup(“three”, 3)
dupはこのような形で呼び出し可能
自分は、どこでなら型推論が働くのか、あまり把
握できてません。コンパイラの奴隷です。
27. implicit
暗黙的にメソッド引数を補完
引数が足りなくても、implicit宣言した値を探し出し
てきて勝手に補完してくれる
def method[A](x: List[A])(implicit y: Param[A]) {
println(x); println(y)
}
abstract class Param[A]
implicit object IntParam extends Param[Int]
implicit object StringParam extends Param[String]
method(List(1,2,3)) <= IntParamを補完
method(List(“a”, “b”, “c”)) <= StringParamを補完
28. implicit
暗黙的に型変換(というより、型をラップ)
C#の拡張メソッドのようなことができる
class Factorizer(x: Int) {
def fact(n: Int): BigInt =
if (n == 0) 1 else fact(n-1) * n
def ! = fact(x)
}
implicit def int2fact(n: Int) = new Factorizer(n)
println(10!)
34. 遅延評価
Scalaでは、引数の評価タイミングを選ぶことが
出来る
Call by Value(Javaとか)
def func(x: Int) =…
Call by Name(Haskellとか)
def func(x: => Int) =…
呼び出される側には、未評価のブロックが渡ってくる
関数渡し
def func(x: () => Int) = …
関数がわたってくる
実質的にはCall by Nameと同じ
35. 遅延評価
変数初期化式の評価タイミングも選べる
lazy val = DB.hogeTable.selectAll
valが最初に評価されるまで、SELECTは行われない
フィボナッチ数列の無限リスト
lazy val fib: Stream[Int] =
Stream.cons(0,
Stream.cons(1,
fib.zip(fib.tail).map(p => p._1 + p._2)))
39. DI
Mix-InとSelf-Type Annotationでそれっぽいも
のが実現可能
Self-Type Annotationとは、Mix-inされ、インスタン
ス化される際の型を指定できる機能
trait SomeTrait {
this: SomeClass =>
…
既存のDIコンテナも使えるけど、相性もある
Scalaだとフィールド定義できないとか
setter/getterがスタイルにあわないとか
41. Actorモデル
動作モデル send async messages Actor
M address
create
M address
Actor 共有領域は持たない
必要な情報はメッセージで
M
M
Actor
address
send async messages
なんかこんなかんじ
詳しく知りたければWikipediaにリンクされてる論文読んで
scala.actorsパッケージでこのモデルをサポート
49. パーサコンビネータ
Scala標準の構文解析ライブラリ群
字句解析してくれるあたり
expr ::= term {'+' term | '-' term}
term ::= factor {'*' factor | '/' factor}
factor ::= floatingPointNumber | '(' expr ')'
object ArithParser extends JavaTokenParsers {
def expr: Parser[Any] = term ~ rep(quot;+quot;~term | quot;-quot;~term)
def term : Parser[Any] = factor ~ rep(quot;*quot;~factor | quot;/quot;~factor)
def factor : Parser[Any] = floatingPointNumber | quot;(quot;~expr~quot;)“
def parse(text : String) = { parseAll(expr, text) }
}
51. ライブラリ
Scala-Swing
Scala標準ライブラリの1つ
デフォルトのアプリケーションモデルを提供
基本的な画面構造をあらかじめ定義
(Simple)GUIApplication
イベントモデルの修正
Event Publisher/Subscriber
イベントハンドラが色んなコンポーネントを知らなくて良い
Swingを利用したプレゼンテーション用言語内DSLと
も見ることができる
リテラルライクな画面構築
ちょっとだけ宣言的に書いている気になれる
52. ライブラリ
Scala-Swing
object SwingApp extends SimpleGUIApplication {
def top = new MainFrame {
title = “SwingApp”; var numclicks = 0
object label extends Label {
text = “Number:” + quot;0 quot;
listenTo(button)
reactions += {
case ButtonClicked(button) =>numclicks = numclicks + 1
text = “Number:” + numclicks
}
}
object button extends Button { text = quot;I am a buttonquot; }
contents = new FlowPanel { contents.append(button, label) }
}
} Scala勉強会@札幌より引用
54. フレームワーク
Lift
View
XMLリテラルによるViewの記述
ControllerではなくView中心、ViewHelperの組み合わせ
みたいな感じ
ORM
ARみたいな標準ORMあり
Djangoとかいうのに似た機能もあるらしい
55. フレームワーク
Liftのアーキテクチャ
登録
フック REST
Boot URLリライト
Comet
early
Lift Ajax
dispatch
呼び出し Rules
Lift Lift Lift Snippet Model
Filter Servlet Session Snippet Model
Template
生成 Request XHTML
State S
http://liftweb.net/index.php/How_lift_processes_HTTP_requests
56. フレームワーク
Form仕様は意味不明 input text
form.html
Menu submit
画面 1-2.refer
1-1./form.html 1-4.register
1-3.instanciate
Lift show Snippet
2-3.値取得
Form画面 Handler
2-2.execute
2-1.submit 2-4.instanciate
Lift show Snippet
57. フレームワーク
Lift
ざっとさわってみて
レイヤの感覚は希薄、model.toFormがHTMLタグ返す
APIが直感的ではない
Ajax、CometはまぁOK
Formが使いづらすぎる
ドキュメントなさすぎ、古すぎ
最新のScalaに対応してない(2008.11.21現在)
71. さわってみた印象
しょせんJavaだから
とか思ってなめてかかると
痛い目にあう
というか意味がわからなくなる
なった