20090911 Seasar Conference2009 Autumn

Preview:

DESCRIPTION

Seasar Conference2009 Autumn Javaプログラマに捧げるScala入門

Citation preview

Javaプログラマに

捧げる

Scala入門Seasar Conference 2009 Autumn

2009年9月12日土曜日

自己紹介

ID:yuroyoroゆろよろ

2009年9月12日土曜日

自己紹介

• 尾崎 智仁(ゆろよろ)

• ID:yuroyoro(はてな、twitter、wassr)

• フリーエンジニア

• JavaとかScalaとかpythonとか

2009年9月12日土曜日

好きなキャラに脳内で変換して

聞いてください・・・

2009年9月12日土曜日

それでは・・・

2009年9月12日土曜日

質問たーいむ!!

2009年9月12日土曜日

Q.Scala本読みました?

2009年9月12日土曜日

今日の内容

•scalaの紹介!

•デモ2連発っ!

•言語仕様弾丸ツアー!

•まとめっ!2009年9月12日土曜日

scalaの紹介!

2009年9月12日土曜日

Q.scalaってなに?

2009年9月12日土曜日

A.幼女です

(id: kumajet)2009年9月12日土曜日

みんな大好きついったーもscalaで動いてます

2009年9月12日土曜日

すからたんが“変態Post”を

処理してると思うと萌えますね?

2009年9月12日土曜日

• jvmで動きます!

•オブジェクト指向 + 関数型

•ファーストクラス関数

•静的型付け + 型推論

•Javaとの相互運用

scalaの特徴

2009年9月12日土曜日

•インタプリタで動作確認が

できる!

•型推論で簡潔なコード

•でも静的型付け言語

scalaの気持ちいいところ

2009年9月12日土曜日

•クロージャ + 充実したコレ

クションライブラリ

•Object,traitで進化したオ

ブジェクト指向

scalaの気持ちいいところ

2009年9月12日土曜日

case class UserTimeline( maxId:Long )

object UserTimelineActor extends Actor{ import Main._

def act = { var cnt:Long = 0 loop{ react{ case UserTimeline( maxId ) => getUserTimeline( maxId ) match { case (xml:Node , nextMaxId:Long ) => outputter.add( xml ) cnt += 200 Thread.sleep(interval) this ! UserTimeline( nextMaxId - 1) case _ => outputter.close exit } } }

scalaのソース(例)

2009年9月12日土曜日

2009年9月12日土曜日

ちょwwwイwwミwwフwwwなにwwwこれww

2009年9月12日土曜日

Scalaは業務では使えない?

2009年9月12日土曜日

No!!2009年9月12日土曜日

今から実証

してやんよ!

2009年9月12日土曜日

デモっ!

2009年9月12日土曜日

demo その1

•scalaで簡単なスクリプトを書いてみる!

•twitter検索でs2conのハッシュタグを検索

•目標5分!

2009年9月12日土曜日

demo その2

•S2Console!•Seasarプロダクトをインタプリタで動作確認

•LLフレームワークの対話環境をJavaにも!

2009年9月12日土曜日

Scala言語仕様弾丸ツアー!

2009年9月12日土曜日

インタプリタで動作を

確認してみよう!

2009年9月12日土曜日

基本編

2009年9月12日土曜日

変数(var,val)

• var/valで変数を宣言• var 変数名:型 = 値• varは変更可能、valは変更不可(final)

2009年9月12日土曜日

変数(var,val)

scala> val i:Int = 1i: Int = 1scala> i = 2<console>:13: error: reassignment to val i = 2 ^scala> var j = 10j: Int = 10scala> j = 20j: Int = 20

varは代入可能

valは再代入できない変数(javaのfinal)

代入しようとするとエラー

2009年9月12日土曜日

型推論

•変数、関数の戻り値は省略可能

•コンパイラーが推論する•型パラメータも含めて推論•関数の引数は省略できない

2009年9月12日土曜日

scala> val list:List[Int] = List(1,2,3,4)

list: List[Int] = List(1, 2, 3, 4)

scala> val list = List(1,2,3,4)

list: List[Int] = List(1, 2, 3, 4)

scala> val a = List(1,2,3).map( _.toString )(0)

a: java.lang.String = 1

省略!

省略できる

関数の戻り値から推論!

型推論

2009年9月12日土曜日

if文

• if/else文は値を返す• ifの条件はBoolean• elseが無い場合は値を返さない(Unit型が結果となる)

• if文の結果を変数に代入できる(三項演算子的な)

2009年9月12日土曜日

scala> val s = "abcdef"s: java.lang.String = abcdef

scala> if( s.startsWith("abc") ) s.length else 0res4: Int = 6

scala> val r = if(s.length > 1) s.substring(1) else ""r: java.lang.String = bcdef

Int型が返る

条件は(Boolean)

if文

結果を代入!

2009年9月12日土曜日

for式によるループ

• for式でコレクションの反復処理(javaの拡張forに相当)

• for( 変数 <- コレクション) { ... }• コレクション生成 - for( 変数 <- コレクション) yield { ... }

• フィルター - for ( n <- 1 to 10 ; if n % 2 == 0) yield { ... }

• break/continueはない! (2.8で実装)2009年9月12日土曜日

scala> for( n <- 1 to 10 if n %2 == 0 ){ print(n * 2 + ",") }4,8,12,16,20,

scala> val g = for( s <- List("a","b","c"); l = s.length )yield { s + ":" + l }g: List[java.lang.String] = List(a:1, b:1, c:1)

1から10のなかで偶数のみ

for式によるループ

結果を代入!

2009年9月12日土曜日

関数編

2009年9月12日土曜日

関数

def countChar ( s:String, c:Char ) : Int = {

var cnt:Int = 0

for( ct <- st if ct == c) {

cnt += 1

}

cnt

}

戻り値の型

関数名

引数仮引数:型

defで関数定義

最後に評価された値が戻り値

2009年9月12日土曜日

• def 関数名( 引数 ): 結果型 = { ... }• val f = 関数名 _ で関数オブジェクト• 関数リテラル - 無名関数的な

関数

val f = (x:Int,y:Int) => { x + y }

• 関数リテラルでは _ で引数のプレースホルダ

引数仮引数:型

本体

2009年9月12日土曜日

scala> def isEven(i:Int):Boolean = { return ( i % 2 == 0 ) } isEven: (Int)Boolean

scala> def isEven(i:Int) = i % 2 == 0isEven: (Int)Boolean

scala> val func = isEven _func: (Int) => Boolean = <function>

scala> val f = (i:Int) => i % 2 == 0f: (Int) => Boolean = <function>

省略!

Javaっぽく書くとこんな感じ

関数をオブジェクトとして変数に

代入!

関数リテラル!

関数

2009年9月12日土曜日

カリー化と部分適用

• def hoge(i:Int)(j:Int) = i + j•引数を()で分けるとカリー化• hoge( 1 )(_:Int)•引数に_を指定して関数を部分適用

2009年9月12日土曜日

scala> def add(n:Int)(m:Int)=n+madd: (n: Int)(m: Int)Int

scala> val add3 = add( 3 ) _add3: (Int) => Int = <function>

scala> def curryingAdd( n:Int ) = add( n ) _curryingAdd: (Int)(Int) => Int

カリー化っ!!

カリー化された”関数”を返す関数

カリー化と部分適用

“_”で部分適用!

2009年9月12日土曜日

ネスト関数とクロージャ

•関数は入れ子(ネスト)にできる!

•関数の外側の変数(自由変数)を参照できる

•自由変数への参照を実行時に取り込む (クロージャ )

2009年9月12日土曜日

def outer ( i:Int, s:String ) = {

val v:String = s + ":" + i

def inner( p:String ) = p + v

inner _

}

入れ子の関数から外側の変数

を参照

自由変数Vを取り込んだinner関数オブジェクト

を返す

ネスト関数とクロージャ

scala> val inf = outer( 5, "hoge" )inf: (String) => java.lang.String = <function>scala> inf("foo - ")res2: java.lang.String = foo - hoge:5

2009年9月12日土曜日

• scalaのコレクションは引数に関数を取るものが多い

• map,filter,foreach,exist ...•柔軟なコレクションの操作• List,Map,Setなど

コレクションに関数を

2009年9月12日土曜日

scala> val list = List(1,2,3,4)res1: List[Int] = List(1, 2, 3, 4)

scala> list.map( {(n:Int) => n * 2} )res2: List[Int] = List(2, 4, 6, 8)

scala> list.filter( _ % 2 == 0 )res3: List[Int] = List(2, 4)

scala> list.filter( func ) res4: List[Int] = List(2, 4)

偶数の要素を抽出

map操作関数リテラルで各要素を2倍

関数オブジェクトを引数に渡す!

コレクションに関数を

2009年9月12日土曜日

クラス編

2009年9月12日土曜日

• class <クラス名>(コンストラクタ引数)• objectでシングルトン定義• ネスト classの中にclassやobject• staticがないscalaでは、コンパニオンオブジェクトを利用する

• 同一スコープに同じ名前のclassとobjectがあると特権的な アクセス権

ObjectFoo

classFoo

privateへのアクセス

クラスとオブジェクト

2009年9月12日土曜日

クラスとオブジェクト

class Foo ( s:String, i:Int ) {

val p1:String = s

var p2:Int = i

private var p3 = 1

def hoge = s * p3

}

object Foo {

val aaa ="aaa"

def setP3( foo:Foo, i:Int) = foo.p3 = i

}

フィールドvalは変更不可varは変更化

クラス名コンストラクタ引数

classでclass定義

関数objectでSingletonobject 同一クラス名の

クラスのprivateフィールドにアクセスできる

2009年9月12日土曜日

• trait は実装をもてるinterface• classやobjectに複数のtraitをMix-In• trait の中で実装を持たないメンバはabstract

traitとmixin

classFoo

traitBar

traitBaz

BarとBazから実装を

継承

2009年9月12日土曜日

traitとmixin

trait Bar {

val bs:String = "Bar"

def bar( n:Int ) = bs * n

}

trait Baz { def baz( n:Int ) = "Baz" * n }

class Foo extends Bar with Baz

traitはフィールド関数をもてる

trait名traitでtrait定義

withで複数のtraitをmixin

2009年9月12日土曜日

• case class <クラス名>(コンストラクタ引数)

• case class は名前(...)でインスタンス生成( immutable object)

• case クラスはパターンとして使える• matchはswitchの強力なやつ• 値 match { case パターン => 処理 ...}• パターン には、値/型/caseクラスを指定

caseクラスとパターンマッチ

2009年9月12日土曜日

abstract class Pt

case class CC(s:String) extends Pt

case class DD(i:Int ,s:String) extends Pt

def test(p:Pt) = p match {

case CC( s ) => println( s )

case DD( 3 ,_) => println(“match DD”)

}

case class定義

抽象クラス

matchしたcase classの値を利用

caseクラスとパターンマッチ

case classをパターンとして

match

2009年9月12日土曜日

他にも変態的な言語仕様が盛りだくさん

ExtractorImplicit conversion

Structural typing

Lazy value

Partial Function

XMLリテラル

Implicitparameter

Existential type

Specialized annotation

2009年9月12日土曜日

• implicit conversion - 暗黙の型変換( StringからDoubleに自動変換etc)

• implict parameter- 型による自動判別を行うデフォルト引数

• structual typing- type safeなダックタイピング

• lazy value- 遅延評価

ちょっとだけよ・・・

2009年9月12日土曜日

• XMLリテラル- xmlをリテラルで評価

• 共変/反変なGenerics- Array[String]はArray[Any]のサブクラス

• actorライブラリ- mesage base非同期処理

• Lift web framework- 関数型webフレームワーク

ちょっとだけよ・・・

2009年9月12日土曜日

まとめっ!

2009年9月12日土曜日

フリーダムすぐる

言語仕様を楽しめ!!

2009年9月12日土曜日

JavaとLLの融合!!

2009年9月12日土曜日

進化したオブジェクト指向でJavaの常識を破壊せよ!!

2009年9月12日土曜日

関数型言語の概念を加えた次世代の

プログラミングパラダイム!!

2009年9月12日土曜日

情報源

•公式サイトhttp://www.scala-lang.org/

• Scala 東北https://sites.google.com/site/scalatohoku/

• Scala-behttp://groups.google.co.jp/group/scala-be

•Programming in Scalahttp://www.amazon.co.jp/Programming-Scala-Comprehensive-Step-step/dp/0981531601

2009年9月12日土曜日

Have fun with

Scala !!

2009年9月12日土曜日

ご清聴ありがとうございました!

2009年9月12日土曜日

Recommended