SlideShare a Scribd company logo
Scalamacrosについて
          @dekosuke
自己紹介




 twitter@dekosuke
 Webエンジニア@D社

 機械学習とHaskell




                     2
はじめに




 マクロの話をします
 Scalamacros(ライブラリ、というより提案)の
  紹介をします




                            3
はじめに



Scalamacrosは
提案なので
現在ではなく
未来の話です


               4
コンパイル時メタプログラミング


 スカラのコンパイラが実行される前に何かやり
  たいですよね
 要するにマクロ(プリプロセッサ)

 Scalaにはコンパイラプラグインがあって、
  scalacの各段階で処理が挟めます(scala-
  virtualizedとかは使ってるらしいです)
 Scalamacrosの話をしましょう!




                          5
Scalamacros



Scalamacros (Project Kepler) by Eugene Burmako
http://scalamacros.org/

Scalaにマクロを持ち込みたい!




                                                  6
マクロの悪名


   C言語のマクロは悪名高い




                   7
マクロの悪名



   C言語のマクロは悪名高い

   そもそもC++のテンプレートが提案された理由
    はC言語マクロほど凶悪でないプリプロセッサ
    がほしからでした




                             8
Project Keplerのマクロ


C言語と違って
 Scalaそのもので書かれている(言語外の何かで

  はない)
 式木の上での変換(生の文字列を操作したりし
  ない)
 Scalaの文法を変えない




                         9
Project Keplerのマクロ




(マクロの利点として)
コード自動生成と違ってコード量が増えない




                       10
例: 型安全なprintf (関数マクロ)
//こんなマクロを書くと
macro def printf(format: String, params: Any*) {
  val (evals, refs) = parse(format, params)
  val seq = evals + refs.map(x => c"print($x)")
  c"$seq"
}

//型安全なprintfが
printf("Value = %d", 123 + 877)

//こう展開されるよ
val p1 = (123 + 877): Int
print("Value = "); print(p1)
                                                   11
例:DB (型マクロ)

macro trait MySqlDb(connString: String) = …

type MyDb = Base with
MySqlDb("Server=127.0.0.1;Database=Foo;")


   Scalaの文法の自然な拡張(意味のないおまじな
    いを増やさない)


                                              12
Boilerplate


                  言語のおまじない
「すべてのBoilerplateを消し去りたい!」


trait TupledFunctions extends Functions with TupleOps { implicit def
fun[A1:Manifest,A2:Manifest,B:Manifest](f: (Rep[A1], Rep[A2]) =>
Rep[B]) : Rep[((A1,A2))=>B] = fun((t: Rep[(A1,A2)]) => f(tuple2_get1(t),
tuple2_get2(t))) implicit def
fun[A1:Manifest,A2:Manifest,A3:Manifest,B:Manifest](f: (Rep[A1],
Rep[A2], Rep[A3]) => Rep[B]) : Rep[((A1,A2,A3))=>B] = fun((t:
Rep[(A1,A2,A3)]) => f(tuple3_get1(t), tuple3_get2(t),
tuple3_get3(t))) ... }                                               13
現状




 “being specified and refined within a Scala
    improvement process (aka SIP #14).”




                                               14
End
作者HP




   作者HP見ると時系列的な進行が分かるよ!
    http://xeno-by.blogspot.com/




                                   16

More Related Content

PPTX
大人のお型付け
PDF
おいしいLisp
PDF
Functional Way
PDF
ALPSチュートリアル(4) Python入門
PPTX
BoostAsioで可読性を求めるのは間違っているだろうか
PDF
Python で munin plugin を書いてみる
PDF
組み込みでこそC++を使う10の理由
PDF
Fork/Join Framework。そしてLambdaへ。
大人のお型付け
おいしいLisp
Functional Way
ALPSチュートリアル(4) Python入門
BoostAsioで可読性を求めるのは間違っているだろうか
Python で munin plugin を書いてみる
組み込みでこそC++を使う10の理由
Fork/Join Framework。そしてLambdaへ。

What's hot (20)

PPTX
ナウなヤングにバカうけのイカしたタグ付き共用体
PDF
C++14 Overview
PDF
並行プログラミングと継続モナド
PPTX
Visual C++で使えるC++11
PDF
Scalaの限定継続の応用と基本
PDF
PDF
Effective modern-c++#9
PDF
emc++ chapter32
PDF
SEH on mingw32
PDF
C++コンパイラ GCCとClangからのメッセージをお読みください
PPTX
PPT
C++でHello worldを書いてみた
ODP
Real World OCamlを読んでLispと協調してみた
PDF
関数型プログラミング入門 with OCaml
PPT
CLR/H No.35-2
PDF
Effective Modern C++ 読書会 Item 35
PDF
研究生のためのC++ no.2
PDF
Visual C++コード分析を支えるSAL
PDF
Emcjp item21
ナウなヤングにバカうけのイカしたタグ付き共用体
C++14 Overview
並行プログラミングと継続モナド
Visual C++で使えるC++11
Scalaの限定継続の応用と基本
Effective modern-c++#9
emc++ chapter32
SEH on mingw32
C++コンパイラ GCCとClangからのメッセージをお読みください
C++でHello worldを書いてみた
Real World OCamlを読んでLispと協調してみた
関数型プログラミング入門 with OCaml
CLR/H No.35-2
Effective Modern C++ 読書会 Item 35
研究生のためのC++ no.2
Visual C++コード分析を支えるSAL
Emcjp item21
Ad

Viewers also liked (7)

DOC
Radhika_Jain_CV
PPTX
Programming Haskell Chapter 11 切符番号選び
PDF
Docker module 1
KEY
プログラミングHaskell 第五章
PPT
Final special education
PPTX
Data.mapについて
PPT
Inclusive education
Radhika_Jain_CV
Programming Haskell Chapter 11 切符番号選び
Docker module 1
プログラミングHaskell 第五章
Final special education
Data.mapについて
Inclusive education
Ad

Similar to Scalamacrosについて (20)

PDF
Phantom Type in Scala
PDF
Everyday Life with clojure.spec
PDF
並列対決 Elixir × Go × C# x Scala , Node.js
PDF
言語アップデート -Scala編-
PDF
ATN No.2 Scala事始め
PDF
思ったほど怖くない! Haskell on JVM 超入門 #jjug_ccc #ccc_l8
PDF
From Scala/Clojure to Kotlin
PDF
10のJava9で変わるJava8の嫌なとこ!
PPT
Scala on Hadoop
PDF
Trait in scala
PPT
Rpscala2011 0601
PDF
Scalaで型クラス入門
PDF
R新機能抄出
PDF
MoteMote Compiler Plugin
PPTX
Apache Spark チュートリアル
PDF
Scala2.8への移行
PDF
Scala2.8への移行
PDF
Hokuriku Scala 1
PDF
Kobe.R #15 - Incanter チョットシッテル
PDF
ScalaでAndroidアプリ開発
Phantom Type in Scala
Everyday Life with clojure.spec
並列対決 Elixir × Go × C# x Scala , Node.js
言語アップデート -Scala編-
ATN No.2 Scala事始め
思ったほど怖くない! Haskell on JVM 超入門 #jjug_ccc #ccc_l8
From Scala/Clojure to Kotlin
10のJava9で変わるJava8の嫌なとこ!
Scala on Hadoop
Trait in scala
Rpscala2011 0601
Scalaで型クラス入門
R新機能抄出
MoteMote Compiler Plugin
Apache Spark チュートリアル
Scala2.8への移行
Scala2.8への移行
Hokuriku Scala 1
Kobe.R #15 - Incanter チョットシッテル
ScalaでAndroidアプリ開発

More from dekosuke (6)

PPTX
Ga nonogram
KEY
Machine learning @ PyFes 2011.10
KEY
スマートフォンについて その1
PPTX
Javascript本19章まとめ
PPTX
Android UIの罠
KEY
スタートHaskell 第二章
Ga nonogram
Machine learning @ PyFes 2011.10
スマートフォンについて その1
Javascript本19章まとめ
Android UIの罠
スタートHaskell 第二章

Scalamacrosについて