SlideShare a Scribd company logo
Java
         Scala

          2009.10 SD2China

Caoyuan (NetBeans Dream Team Memeber)


     http://blogtrader.net/dcaoyuan/
•   JVM
    123.toByte
    "1".toInt
    true.toString


•   val compare = (x: Int, y: Int) => x > y
    compare(1, 2) // result: Boolean = false


•   Java sta&c
                                (   )                Scala   object
    object Dog {
      val whatever = "dog" // static field in Java
    }
    class Dog {
      def callWhatever = Dog.whatever
    }
•   val compare = (x: Int, y: Int) => x > y
    list sortWith compare


•   class AComparator {
      def compare(x: Int, y: Int) = x > y
    }
    list sortWith (new AComparator).compare


•   object annonymous extends scala.Function2[Int, Int, Boolean] {
      override def apply(x: Int, y: Int) = x > y
    }
    list sortWith annonymous


•           sta&c                             object
          (     )
(1)
•   1.+(1)
                                                              ”.” ”()”
    1 + 1
    1.>(0)
    1 > 0
    (1 > 0).&(2 > 1)
    (1 > 0) & 2 > 1
    stack.push(10)
    stack push 10
    stack.pop
    stack pop

•   stack   push {
                                      {...}
      val   a = 1
      val   b = 2
      a +   b
    }

•   def !@#%^&*-<=>?|~:/ = println("noop")
    def √(x: Double) = Math.sqrt(x)
    val Π = Math.Pi
    val r = √(9*Π)

•   ‘<’, ‘>’                                  ’[’ ‘]’
(2)
•   for
    for (i <- List(1, 2)) {
      println(i)
    }
    List(1, 2) foreach {i => println(i)}

    for (i <- List(1, 2)) yield {
      i + 10
    }
    List(1, 2) map {i => i + 10}


•   // synchronized is function call instead of keyword
    def check = synchronized {
      // isInstanceOf is function call instead of keyword
      100.isInstanceOf[String]
    }


•   stack.pop.asInstanceOf[Int] // (Integer) stack.pop() in Java
•                                      return
    val r1 = { // return 3
      val a = 1
      val b = 2
      a + b
    }

    val r2 = if (true) 1 else 2

    val r3 = // return (): Unit
      for (i <- List(1, 2)) {
        println(i)
      }

    val r4 = // return List(11, 12)
      for (i <- List(1, 2)) yield {
        i + 10
      }

    val r5 = // return java.io.File
      try {
        val f = new File("afile")
        f
      } catch {
        case ex: IOException => null
      }
Scala




           (   )


           =
        OO + FP
Scala-对Java的修正和超越
(1)
•   Scala                              Any Any                JVM

    •   JVM             (byte, short, char, int, long, float, double, boolean) void
    •     Scala     (Byte, Short, Char, Int, Long, Float, Double, Boolean) Unit
           AnyVal
    •   JVM               AnyRef (java.lang.Object)

    // Scala, Array     8
    val arrayOfListOfString = new Array[List[String]](10)
    val arrayOfAny: Array[_] = Array(1, 2)
    // Java
    List<String>[] arrayOfListOfString = new ArrayList<String>[10]



•   Scala                                 Null     Nothing
    •   JVM    null      Null              AnyRef
    •   Nothing Scala              (     AnyVal AnyRef)
(1)
(2)
              -
•      (Invariant): C[T], C is invariant on T
       Tsub Tsup T                         C[Tsub] C[Tsup]    C[T]

•      (Covariant): C[+T], C is covariant on T
       Tsub T                C[Tsub]      C[T]

•      (Contrava&ant): C[‐T], C is contravariant on T
       Tsup T              C[Tsup]       C[T]



    Java                                                ?
    Scala                                        +/-
(2)
class Animal {}
class Dog extends Animal {}
class Fox extends Animal {}


•          Animal                      Animal
class Xian<T> {} // Java                        class Xian[+T]   //

void isAnimalXian(Xian<? extends Animal> in)    def isAnimalXian(in: Xian[Animal])

isAnimalXian(new Xian<Dog>())                   isAnimalXian(new Xian[Dog])
isAnimalXian(new Xian<Fox>())                   isAnimalXian(new Xian[Fox])




•          Dog                  Dog
class Xian<T> {} // Java                        class Xian[-T]   //

void isDogXian(Xian<? super Dog> in)            def isDogXian(in: Xian[Dog])

isDogXian(new Xian[Animal])                     isDogXian(new Xian[Animal])
vs
•
trait Pair[K, V] {                      class PairImpl extends Pair[Dog, Fox] {
  def get(key: K): V                      def get(key: Dog): Fox
  def set(key: K, value: V)               def put(key: Dog, value: Fox)
}                                       }

                                                 =>


•                                                 +                    +
trait Pair {                            class PairImpl extends Pair {
  type K // deferred type                 type K = Dog
  type V // deferred type                 type V = Fox

    def get(key: K): V                      def get(key: K): V
    def set(key: K, value: V)               def set(key: K, value: V)
}                                       }

                                            =>
•          =>     /
•          =>                 type StrToList = HashMap[String, List[String]]
Trait Structural Type
• Trait:     +              =>
• Structural Type:
                                            Type
trait Subject {
  type Observer = {def update(subject: Subject)} // type member

    private var observers = List[Observer]()   // field
    def addObserver(observer: Observer) = observers ::= observer
    def notifyObservers = observers foreach (_.update(this))
}

class Price(var value: Double) {def setValue(v: Double) = value = v}


                                                                  Java Interface
                                                                 Trait
val observablePrice = new Price(10) with Subject {
  override def setValue(v: Double) = {
    super.setValue(v); notifyObservers
  }
}

observablePrice.addObserver(new AnyRef {              update(Subject)      Observer
     def update(subject: Subject) {
       println("price changed")
    }
  })
Trait Self Type
•
    •                    Class                 Trait: OilPrice extends Price with Subject with Market with ....
    •
    •               (Self Type)


trait Subject {self: Price =>
  type Observer = {def update(subject: Price)} // type member

    private var observers = List[Observer]()   // field
                                                                                                                  this   Subject
    def addObserver(observer: Observer) = observers ::= observer
    def notifyObservers = observers foreach (_.update(this))
}

observablePrice.addObserver(new AnyRef { // only need a update(Any) method
     def update(subject: Price) {
       println("price changed to " + subject.value)
     }
  })

• Self Type:
    •       Trait
    •                                        class trait
    •       self       Trait super                   this      self                  self
    •                                Trait
        •
        •                                          class              trait (                   Class      )
apply
•           apply                   <instance>(args)   <instance>.apply(args)
•   apply                     Class
    class Price(var value: Int) {
      def apply() = value // ‘def apply = value’, without ’()’ is bad idea
    }

    object Price {
      def apply(v: Int) = new Price(v)
    }

    val p = Price(10)
    p           // Price@565f0e7d
    p()         // 10
    Price(10)() // 10

•   apply       Scala
    val list = List(1, 2, 3)         // List.apply[A](xs: A*)
    val array = Array("a", "b", "c") // Array.apply[T](xs: T*)
    val map = Map("a" -> 1,
                  "b" -> 2,
                  "c" -> 3) // MapFactory.apply[A, B](elems: (A, B)*)

    array(0) // array.apply(index): "a"
    map("a") // map.apply(key): 1
•   Java Switch                  (          Java7) Scala
    val str = "abcdef"
    str.toSeq match {
      case Seq('a', 'b', rest@_*) => println(rest) // cdef
      case _ => println("no match")
    }

    var any: Any = _
    any match {
      case "scala" | "java" => "string"
      case i: Int if i > 10 => "int > 10"
      case `str` => "abcdef"
      case _: String => "string type"
      case hd :: tail => "List"
      case _ => "other"
    }

    case class Address(coutry: String, city: String, street: String, no: Int)
    case class Person(name: String, age: Int, address: Address)

    val p = Person("Wang wu", 12, Address("China", "Beijing", "Chang'an", 10))

    p match {
      case Person(name, age, Address(coutry, city, street, no)) =>
        println(name + "|" + coutry + "|" + city + "|" + street + "|" + no)
    }
Scala
• Existential type (    Java   )
• Implicit type * (                              )
• val, var, lazy val (                       )
• Partial function * (                               )
• Primary constructor (                          apply)
• Accessor properties (Why getter, setter?        )
• XML Process (          )



*      DSL
(DSL     )
•   Actors
    class Ping(count: Int, pong: Actor) extends Actor {
      def act() {
        var pingsLeft = count - 1
        pong ! Ping
        while (true) {
          receive {                                                {...}
            case Pong =>
              if (pingsLeft % 1000 == 0)
                println("Pong”)
              if (pingsLeft > 0) {
                pong ! Ping
                pingsLeft -= 1
              } else {
                pong ! Stop
                exit()
              }}}}}
•   Bill Venners scalatest
    class StackSpec extends FlatSpec with ShouldMatchers {

        "A Stack" should "pop values in last-in-first-out order" in {
          val stack = new Stack[Int]
          stack.push(1)
          stack.push(2)
          stack.pop() should equal (2)                          should
          stack.pop() should equal (1)
        }

        it should "throw NoSuchElementException if an empty stack is popped" in {
          val emptyStack = new Stack[String]
          evaluating { emptyStack.pop() } should produce [NoSuchElementException]
        }
    }
Scala                   Java

Scala Java
• Scala            Java
   • Array
• Scala                Java       Java
   •          object
• Scala
   • Actors   Packrat Parser




                          Scala
Scala        Java


• Scala
•       Java         Scala(    nio )
•       Scala   (   liftweb)
• IDE
IDE

• IntelliJ Idea
  •5
  •

• Eclipse
  •       Sean McDirmid
  •       1              (Miles Sabin)
  • Scala             Martin IDE


• NetBeans
  •                (dcaoyuan)
  • 2007   LL(K)
  • 2008         PEGs
  • 2008         Scala              Hacking NetBeans Innovation Grant
  • 2009 8           Scala    Scala             Martin IDE
IDE               -NetBeans
•
    •
    •
    •
    •
    •
    •
    •
    •
    •
    •         HTML
    •
    •
    • Java/Scala
    •
    •            import
    •
    •
    • Maven
•
    • NetBeans 6.7.x                     7000
    • NetBeans 6.8m2            Scala-2.8.0     beta
       http://wiki.netbeans.org/Scala68v1
Scala for NetBeans
Q&A

More Related Content

PDF
Scala in Places API
PDF
A bit about Scala
PDF
Scala for Jedi
KEY
Scala for ruby programmers
PPT
SDC - Einführung in Scala
PDF
Scala 2013 review
PPTX
Practically Functional
PDF
Scala: Object-Oriented Meets Functional, by Iulian Dragos
Scala in Places API
A bit about Scala
Scala for Jedi
Scala for ruby programmers
SDC - Einführung in Scala
Scala 2013 review
Practically Functional
Scala: Object-Oriented Meets Functional, by Iulian Dragos

What's hot (20)

PDF
Scala for Java Programmers
ODP
1.2 scala basics
PDF
High Wizardry in the Land of Scala
PDF
Scala collections api expressivity and brevity upgrade from java
PPTX
Scala for curious
ODP
Scala traits training by Sanjeev Kumar @Kick Start Scala traits & Play, organ...
KEY
Scalaz
PDF
Scala Intro
PPTX
Practical scalaz
PDF
Kotlin Basics - Apalon Kotlin Sprint Part 2
PPTX
All about scala
PDF
Workshop Scala
PDF
PDF
Scala for Java Developers - Intro
PPT
Scala - brief intro
PPTX
Joy of scala
PDF
Introduction to Scala for Java Developers
PDF
Stepping Up : A Brief Intro to Scala
PDF
Scala jargon cheatsheet
PPTX
Scala Back to Basics: Type Classes
Scala for Java Programmers
1.2 scala basics
High Wizardry in the Land of Scala
Scala collections api expressivity and brevity upgrade from java
Scala for curious
Scala traits training by Sanjeev Kumar @Kick Start Scala traits & Play, organ...
Scalaz
Scala Intro
Practical scalaz
Kotlin Basics - Apalon Kotlin Sprint Part 2
All about scala
Workshop Scala
Scala for Java Developers - Intro
Scala - brief intro
Joy of scala
Introduction to Scala for Java Developers
Stepping Up : A Brief Intro to Scala
Scala jargon cheatsheet
Scala Back to Basics: Type Classes
Ad

Similar to Scala-对Java的修正和超越 (20)

PDF
(How) can we benefit from adopting scala?
PPTX
PPT
An introduction to scala
PDF
ハイブリッド言語Scalaを使う
PPTX
An introduction to scala
PDF
Scala: Functioneel programmeren in een object georiënteerde wereld
PDF
Type classes 101 - classification beyond inheritance
PDF
Feel of Kotlin (Berlin JUG 16 Apr 2015)
PDF
Scala or functional programming from a python developer's perspective
ODP
2.1 recap from-day_one
PDF
Meet scala
PDF
Javascript Uncommon Programming
PDF
Power of functions in a typed world
PDF
楽々Scalaプログラミング
ODP
1.2 scala basics
PDF
Scala introduction
PDF
Scala @ TechMeetup Edinburgh
PDF
A Prelude of Purity: Scaling Back ZIO
PPTX
Types by Adform Research, Saulius Valatka
PDF
pragmaticrealworldscalajfokus2009-1233251076441384-2.pdf
(How) can we benefit from adopting scala?
An introduction to scala
ハイブリッド言語Scalaを使う
An introduction to scala
Scala: Functioneel programmeren in een object georiënteerde wereld
Type classes 101 - classification beyond inheritance
Feel of Kotlin (Berlin JUG 16 Apr 2015)
Scala or functional programming from a python developer's perspective
2.1 recap from-day_one
Meet scala
Javascript Uncommon Programming
Power of functions in a typed world
楽々Scalaプログラミング
1.2 scala basics
Scala introduction
Scala @ TechMeetup Edinburgh
A Prelude of Purity: Scaling Back ZIO
Types by Adform Research, Saulius Valatka
pragmaticrealworldscalajfokus2009-1233251076441384-2.pdf
Ad

Recently uploaded (20)

PPTX
Detection-First SIEM: Rule Types, Dashboards, and Threat-Informed Strategy
PDF
Modernizing your data center with Dell and AMD
PDF
Electronic commerce courselecture one. Pdf
PDF
Advanced methodologies resolving dimensionality complications for autism neur...
PDF
Diabetes mellitus diagnosis method based random forest with bat algorithm
PDF
TokAI - TikTok AI Agent : The First AI Application That Analyzes 10,000+ Vira...
PDF
NewMind AI Monthly Chronicles - July 2025
PDF
Reach Out and Touch Someone: Haptics and Empathic Computing
PPTX
VMware vSphere Foundation How to Sell Presentation-Ver1.4-2-14-2024.pptx
PDF
How UI/UX Design Impacts User Retention in Mobile Apps.pdf
PPTX
PA Analog/Digital System: The Backbone of Modern Surveillance and Communication
PDF
Per capita expenditure prediction using model stacking based on satellite ima...
PDF
Bridging biosciences and deep learning for revolutionary discoveries: a compr...
PPTX
Understanding_Digital_Forensics_Presentation.pptx
PDF
Encapsulation theory and applications.pdf
PDF
CIFDAQ's Market Insight: SEC Turns Pro Crypto
PDF
Spectral efficient network and resource selection model in 5G networks
DOCX
The AUB Centre for AI in Media Proposal.docx
PDF
The Rise and Fall of 3GPP – Time for a Sabbatical?
PDF
Shreyas Phanse Resume: Experienced Backend Engineer | Java • Spring Boot • Ka...
Detection-First SIEM: Rule Types, Dashboards, and Threat-Informed Strategy
Modernizing your data center with Dell and AMD
Electronic commerce courselecture one. Pdf
Advanced methodologies resolving dimensionality complications for autism neur...
Diabetes mellitus diagnosis method based random forest with bat algorithm
TokAI - TikTok AI Agent : The First AI Application That Analyzes 10,000+ Vira...
NewMind AI Monthly Chronicles - July 2025
Reach Out and Touch Someone: Haptics and Empathic Computing
VMware vSphere Foundation How to Sell Presentation-Ver1.4-2-14-2024.pptx
How UI/UX Design Impacts User Retention in Mobile Apps.pdf
PA Analog/Digital System: The Backbone of Modern Surveillance and Communication
Per capita expenditure prediction using model stacking based on satellite ima...
Bridging biosciences and deep learning for revolutionary discoveries: a compr...
Understanding_Digital_Forensics_Presentation.pptx
Encapsulation theory and applications.pdf
CIFDAQ's Market Insight: SEC Turns Pro Crypto
Spectral efficient network and resource selection model in 5G networks
The AUB Centre for AI in Media Proposal.docx
The Rise and Fall of 3GPP – Time for a Sabbatical?
Shreyas Phanse Resume: Experienced Backend Engineer | Java • Spring Boot • Ka...

Scala-对Java的修正和超越

  • 1. Java Scala 2009.10 SD2China Caoyuan (NetBeans Dream Team Memeber) http://blogtrader.net/dcaoyuan/
  • 2. JVM 123.toByte "1".toInt true.toString • val compare = (x: Int, y: Int) => x > y compare(1, 2) // result: Boolean = false • Java sta&c ( ) Scala object object Dog { val whatever = "dog" // static field in Java } class Dog { def callWhatever = Dog.whatever }
  • 3. val compare = (x: Int, y: Int) => x > y list sortWith compare • class AComparator { def compare(x: Int, y: Int) = x > y } list sortWith (new AComparator).compare • object annonymous extends scala.Function2[Int, Int, Boolean] { override def apply(x: Int, y: Int) = x > y } list sortWith annonymous • sta&c object ( )
  • 4. (1) • 1.+(1) ”.” ”()” 1 + 1 1.>(0) 1 > 0 (1 > 0).&(2 > 1) (1 > 0) & 2 > 1 stack.push(10) stack push 10 stack.pop stack pop • stack push { {...} val a = 1 val b = 2 a + b } • def !@#%^&*-<=>?|~:/ = println("noop") def √(x: Double) = Math.sqrt(x) val Π = Math.Pi val r = √(9*Π) • ‘<’, ‘>’ ’[’ ‘]’
  • 5. (2) • for for (i <- List(1, 2)) { println(i) } List(1, 2) foreach {i => println(i)} for (i <- List(1, 2)) yield { i + 10 } List(1, 2) map {i => i + 10} • // synchronized is function call instead of keyword def check = synchronized { // isInstanceOf is function call instead of keyword 100.isInstanceOf[String] } • stack.pop.asInstanceOf[Int] // (Integer) stack.pop() in Java
  • 6. return val r1 = { // return 3 val a = 1 val b = 2 a + b } val r2 = if (true) 1 else 2 val r3 = // return (): Unit for (i <- List(1, 2)) { println(i) } val r4 = // return List(11, 12) for (i <- List(1, 2)) yield { i + 10 } val r5 = // return java.io.File try { val f = new File("afile") f } catch { case ex: IOException => null }
  • 7. Scala ( ) = OO + FP
  • 9. (1) • Scala Any Any JVM • JVM (byte, short, char, int, long, float, double, boolean) void • Scala (Byte, Short, Char, Int, Long, Float, Double, Boolean) Unit AnyVal • JVM AnyRef (java.lang.Object) // Scala, Array 8 val arrayOfListOfString = new Array[List[String]](10) val arrayOfAny: Array[_] = Array(1, 2) // Java List<String>[] arrayOfListOfString = new ArrayList<String>[10] • Scala Null Nothing • JVM null Null AnyRef • Nothing Scala ( AnyVal AnyRef)
  • 10. (1)
  • 11. (2) - • (Invariant): C[T], C is invariant on T Tsub Tsup T C[Tsub] C[Tsup] C[T] • (Covariant): C[+T], C is covariant on T Tsub T C[Tsub] C[T] • (Contrava&ant): C[‐T], C is contravariant on T Tsup T C[Tsup] C[T] Java ? Scala +/-
  • 12. (2) class Animal {} class Dog extends Animal {} class Fox extends Animal {} • Animal Animal class Xian<T> {} // Java class Xian[+T] // void isAnimalXian(Xian<? extends Animal> in) def isAnimalXian(in: Xian[Animal]) isAnimalXian(new Xian<Dog>()) isAnimalXian(new Xian[Dog]) isAnimalXian(new Xian<Fox>()) isAnimalXian(new Xian[Fox]) • Dog Dog class Xian<T> {} // Java class Xian[-T] // void isDogXian(Xian<? super Dog> in) def isDogXian(in: Xian[Dog]) isDogXian(new Xian[Animal]) isDogXian(new Xian[Animal])
  • 13. vs • trait Pair[K, V] { class PairImpl extends Pair[Dog, Fox] { def get(key: K): V def get(key: Dog): Fox def set(key: K, value: V) def put(key: Dog, value: Fox) } } => • + + trait Pair { class PairImpl extends Pair { type K // deferred type type K = Dog type V // deferred type type V = Fox def get(key: K): V def get(key: K): V def set(key: K, value: V) def set(key: K, value: V) } } => • => / • => type StrToList = HashMap[String, List[String]]
  • 14. Trait Structural Type • Trait: + => • Structural Type: Type trait Subject { type Observer = {def update(subject: Subject)} // type member private var observers = List[Observer]() // field def addObserver(observer: Observer) = observers ::= observer def notifyObservers = observers foreach (_.update(this)) } class Price(var value: Double) {def setValue(v: Double) = value = v} Java Interface Trait val observablePrice = new Price(10) with Subject { override def setValue(v: Double) = { super.setValue(v); notifyObservers } } observablePrice.addObserver(new AnyRef { update(Subject) Observer def update(subject: Subject) { println("price changed") } })
  • 15. Trait Self Type • • Class Trait: OilPrice extends Price with Subject with Market with .... • • (Self Type) trait Subject {self: Price => type Observer = {def update(subject: Price)} // type member private var observers = List[Observer]() // field this Subject def addObserver(observer: Observer) = observers ::= observer def notifyObservers = observers foreach (_.update(this)) } observablePrice.addObserver(new AnyRef { // only need a update(Any) method def update(subject: Price) { println("price changed to " + subject.value) } }) • Self Type: • Trait • class trait • self Trait super this self self • Trait • • class trait ( Class )
  • 16. apply • apply <instance>(args) <instance>.apply(args) • apply Class class Price(var value: Int) { def apply() = value // ‘def apply = value’, without ’()’ is bad idea } object Price { def apply(v: Int) = new Price(v) } val p = Price(10) p // Price@565f0e7d p() // 10 Price(10)() // 10 • apply Scala val list = List(1, 2, 3) // List.apply[A](xs: A*) val array = Array("a", "b", "c") // Array.apply[T](xs: T*) val map = Map("a" -> 1, "b" -> 2, "c" -> 3) // MapFactory.apply[A, B](elems: (A, B)*) array(0) // array.apply(index): "a" map("a") // map.apply(key): 1
  • 17. Java Switch ( Java7) Scala val str = "abcdef" str.toSeq match { case Seq('a', 'b', rest@_*) => println(rest) // cdef case _ => println("no match") } var any: Any = _ any match { case "scala" | "java" => "string" case i: Int if i > 10 => "int > 10" case `str` => "abcdef" case _: String => "string type" case hd :: tail => "List" case _ => "other" } case class Address(coutry: String, city: String, street: String, no: Int) case class Person(name: String, age: Int, address: Address) val p = Person("Wang wu", 12, Address("China", "Beijing", "Chang'an", 10)) p match { case Person(name, age, Address(coutry, city, street, no)) => println(name + "|" + coutry + "|" + city + "|" + street + "|" + no) }
  • 18. Scala • Existential type ( Java ) • Implicit type * ( ) • val, var, lazy val ( ) • Partial function * ( ) • Primary constructor ( apply) • Accessor properties (Why getter, setter? ) • XML Process ( ) * DSL
  • 19. (DSL ) • Actors class Ping(count: Int, pong: Actor) extends Actor { def act() { var pingsLeft = count - 1 pong ! Ping while (true) { receive { {...} case Pong => if (pingsLeft % 1000 == 0) println("Pong”) if (pingsLeft > 0) { pong ! Ping pingsLeft -= 1 } else { pong ! Stop exit() }}}}} • Bill Venners scalatest class StackSpec extends FlatSpec with ShouldMatchers { "A Stack" should "pop values in last-in-first-out order" in { val stack = new Stack[Int] stack.push(1) stack.push(2) stack.pop() should equal (2) should stack.pop() should equal (1) } it should "throw NoSuchElementException if an empty stack is popped" in { val emptyStack = new Stack[String] evaluating { emptyStack.pop() } should produce [NoSuchElementException] } }
  • 20. Scala Java Scala Java • Scala Java • Array • Scala Java Java • object • Scala • Actors Packrat Parser Scala
  • 21. Scala Java • Scala • Java Scala( nio ) • Scala ( liftweb) • IDE
  • 22. IDE • IntelliJ Idea •5 • • Eclipse • Sean McDirmid • 1 (Miles Sabin) • Scala Martin IDE • NetBeans • (dcaoyuan) • 2007 LL(K) • 2008 PEGs • 2008 Scala Hacking NetBeans Innovation Grant • 2009 8 Scala Scala Martin IDE
  • 23. IDE -NetBeans • • • • • • • • • • • HTML • • • Java/Scala • • import • • • Maven • • NetBeans 6.7.x 7000 • NetBeans 6.8m2 Scala-2.8.0 beta http://wiki.netbeans.org/Scala68v1
  • 25. Q&A