Varietékünstler Die Programmiersprache Scala. Jan Hermanns. www.sushi3003.de



Ähnliche Dokumente
Programmierparadigmen und Sprachen

Scala kann auch faul sein

Einführung in die Programmierung

Übung 1 mit C# 6.0 MATTHIAS RONCORONI

Funktionale Programmierung

Das Typsystem von Scala. L. Piepmeyer: Funktionale Programmierung - Das Typsystem von Scala

Typumwandlungen bei Referenztypen

Objektorientierte Programmierung

Programmieren in Java

Vererbung & Schnittstellen in C#

Objektorientierung: Klassen und Objekte

Java Kurs für Anfänger Einheit 4 Klassen und Objekte

Große Übung Praktische Informatik 1

Probeklausur: Programmierung WS04/05

Java: Vererbung. Teil 3: super()

5.5.8 Öffentliche und private Eigenschaften

Computeranwendung und Programmierung (CuP)

Das erste Programm soll einen Text zum Bildschirm schicken. Es kann mit jedem beliebigen Texteditor erstellt werden.

Zählen von Objekten einer bestimmten Klasse

Klassenbeziehungen & Vererbung

Algorithmen und Datenstrukturen

Prinzipien Objektorientierter Programmierung

Vorkurs C++ Programmierung

Studentische Lösung zum Übungsblatt Nr. 7

Erwin Grüner

Einführung Datentypen Verzweigung Schleifen Funktionen Dynamische Datenstrukturen. Java Crashkurs. Kim-Manuel Klein

Modul 122 VBA Scribt.docx

Neue Features in C# 2.0

5. Tutorium zu Programmieren

Einführung in die objektorientierte Programmierung mit Java. Klausur am 19. Oktober 2005

Institut für Programmierung und Reaktive Systeme 25. August Programmier-Labor Übungsblatt. int binarysearch(int[] a, int x),

Programmiervorkurs SS 2011 Technische Universität Darmstadt Jan Hendrik Burdinski, Felix Kerger

Objektorientierte Programmierung. Kapitel 12: Interfaces

Innere Klassen in Java

Unterprogramme. Funktionen. Bedeutung von Funktionen in C++ Definition einer Funktion. Definition einer Prozedur

Java Einführung Umsetzung von Beziehungen zwischen Klassen. Kapitel 7

versus Christian Grobmeier

Einfache Ausdrücke Datentypen Rekursive funktionale Sprache Franz Wotawa Institut für Softwaretechnologie

Einführung in Javadoc

Einführung in die Programmierung für Wirtschaftsinformatik

Objects First With Java A Practical Introduction Using BlueJ. Mehr über Vererbung. Exploring polymorphism 1.0

Themen. Web Service - Clients. Kommunikation zw. Web Services

1 Polymorphie (Vielgestaltigkeit)

Gebundene Typparameter

Testen mit JUnit. Motivation

Grundlagen der Programmierung Prof. H. Mössenböck. 14. Schrittweise Verfeinerung

Programmierung 2. Übersetzer: Code-Erzeugung. Sebastian Hack. Klaas Boesche. Sommersemester

Ich liebe Java && Ich liebe C# Rolf Borst

Ausdrücke in Scala. Funktionale Programmierung. Christoph Knabe FB VI

Delegatesund Ereignisse

Java Einführung Collections

Programmierkurs Python I

Grundlagen von Python

Javakurs zu Informatik I. Henning Heitkötter

Java Reflection. Meta-Programmierung mit der java.lang.reflection API. Prof. Dr. Nikolaus Wulff

Softwaretechnologie - Wintersemester 2012/ Dr. Günter Kniesel

Software Engineering Klassendiagramme Einführung

Assoziation und Aggregation

WPF Steuerelemente Listbox, ComboBox, ListView,

Algorithmen mit Python

Vererbung und Traits

Einführung in die Programmierung

Kontrollstrukturen und Funktionen in C

Übersicht Programmablaufsteuerung

Verhindert, dass eine Methode überschrieben wird. public final int holekontostand() {...} public final class Girokonto extends Konto {...

Java Einführung Abstrakte Klassen und Interfaces

Grundkonstrukte der Objektorientierung in Java, C# und C++

4 Vererbung, Polymorphie

Seminar Scala SS2010, Einführung. R. Schiedermeier Fakultät 07 für Informatik und Mathematik

Objektorientierte Programmierung mit C++ Vector und List

Einführung in die Java- Programmierung

5. Abstrakte Klassen. Beispiel (3) Abstrakte Klasse. Beispiel (2) Angenommen, wir wollen die folgende Klassenhierarchie implementieren:

Kapitel 9. Inner Classes. 9.1 Wiederholung: Iteratoren. Ausführen einer Operation auf allen Elementen einer Containerklasse

Besonderheiten von C#

Einstieg in die Informatik mit Java

Java Kurs für Anfänger Einheit 5 Methoden

Workshop 6. Einführung in die objektorientierte Programmierung. Teil: Java mit BlueJ

Wintersemester Maschinenbau und Kunststofftechnik. Informatik. Tobias Wolf Seite 1 von 22

Programmierung in C. Grundlagen. Stefan Kallerhoff

SEP 114. Design by Contract

Vorlesung Informatik II

Design by Contract with JML

Pass by Value Pass by Reference Defaults, Overloading, variable Parameteranzahl

Fachgebiet Informationssysteme Prof. Dr.-Ing. N. Fuhr. Programmierung Prof. Dr.-Ing. Nobert Fuhr. Übungsblatt Nr. 6

Objektorientierte Programmierung

Klausur in Programmieren

Folge 18 - Vererbung

Funktionen Häufig müssen bestimmte Operationen in einem Programm mehrmals ausgeführt werden. Schlechte Lösung: Gute Lösung:

Applet Firewall und Freigabe der Objekte

U08 Entwurfsmuster (II)

Kapitel 6. Vererbung

public class SternchenRechteckGefuellt {

5. Abstrakte Klassen

Graphic Coding. Klausur. 9. Februar Kurs A

Diana Lange. Generative Gestaltung Operatoren

Objektorientierte Programmierung

Praktische Informatik 3: Funktionale Programmierung Vorlesung 13 vom : Scala Eine praktische Einführung

Methoden. von Objekten definiert werden, Methoden,, Zugriffsmethoden und Read-Only

Codegeneratoren mit Xtend , A. Arnold

Kontrollstrukturen - Universität Köln

Transkript:

Varietékünstler Die Programmiersprache Scala Jan Hermanns www.sushi3003.de

Wer hat`s erfunden? Entwickelt von Martin Odersky an der EPFL Erstes Release 2003

Scala Überblick Interoperabilität mit Java Java-Bytecode Compiler aber es gibt auch einen Scripting-Interpreter Vereint OOP und FP einheitliches Objektmodell higher-order functions Statisches Typsystem (mit Type Inference) Objektdekomposition mittels Pattern Matching XML Support

Scala Performance Raytracer Implementierungen im Vergleich Java-Version Scala-Version Groovy-Version 12s 12s 2h 31m 42s

Hello World object HelloWorld { def main(args:array[string]) = println("hello World!")

Ein etwas aufwendigeres Beispiel package swingdemo import javax.swing.{jframe, JLabel object Main extends Application { import JFrame._ def gettitle() = "Scala can Swing" val frm = new JFrame(getTitle) frm.getcontentpane.add(new JLabel("Hello")) frm.setdefaultcloseoperation(exit_on_close) frm.pack frm setvisible true

Interoperabilität Scala kann Instanzen von Java-Klassen erzeugen von Java-Klassen erben und Java-Interfaces implementieren auf Methoden und Felder von Java-Komponenten zugreifen Scala-Klassen können von Java aus instanziiert und verwendet werden im Zweifel das Kompilat mit javap anschauen

Konstruktoren class ImmutableFoo(val bar:int) class MutableFoo(var bar:int) Für Konstruktorparameter werden Properties angelegt, deren Zugriff durch die Modiefier val und var geregelt wird val bedeutet read-only var bedeutet read-write val mutable = new MutableFoo(32) println(mutable.bar) mutable.bar = 35

Java vs. Scala Java public class Person { private String firstname; private String lastname; private int age; public Person(String firstname, String lastname, int age) { this.firstname = firstname; this.lastname = lastname; this.age = age; public void setfirstname(string firstname) { this.firstname = firstname; public void String getfirstname() { return this.firstname; public void setlastname(string lastname) { this.lastname = lastname; public void String getlastname() { return this.lastname; public void setage(int age) { this.age = age; public void int getage() { return this.age; Scala class Person(var firstname: String, var lastname: String, var age: Int)

Uniform Access Principle Implementierung eigener virtueller Properties class AbsInt(num:Int) { private var v = Math.abs(num) def value = v def value_=(num:int) = { v = Math.abs(num) val n = new AbsInt(-5) println(n.value) n.value = 6 // n.value_=(6)

Methoden als Operatoren verwenden class MyInt(val n:int) { def max(that:myint) = if (n > that.n) this else that Jede Methode, die genau eine Parameter erwartet kann als Infix-Operator verwendet werden var i = new MyInt(1) var j = new MyInt(2) println(i max j)

Operatoren definieren class MyInt(val n:int) { def +(that:myint) = new MyInt(n + that.n) def unary_-() = new MyInt(-1 * n) def ++() = new MyInt(n +1) Verwendung von Infix-, Prefix- und Postfix- Operatoren var i = new MyInt(1) var j = new MyInt(2) println(i + j) println(-i) println(i++)

Traits Vergleichbar mit Java-Interfaces, allerdings können Traits auch Implementierungen beinhalten trait Foo { def foo():int def bar() = foo + 1 class Test extends Foo { def foo() = 4

Traits Objekte können auch ad hoc mit Traits erweitert werden trait Logging { def log = println(this) class Test { override def tostring = "Test" val t = new Test with Logging t.log

Traits Mehrfach Vererbung abstract class Hello { def hello:string trait Foo extends Hello { override def hello = "Foo" trait Bar extends Hello { override def hello = "Bar" class Test extends Foo with Bar { override def tostring = hello println(new Test)

Pattern Matching Das match/case Konstrukt dient zur Dekomposition von Objekten def domatch(a:any) = a match { case i:int => "Integer:" + i case f:float => "Float:" + f case _ => "don't know" println(domatch(3)) println(domatch(2.1f)) println(domatch("hello"))

Pattern Matching Syntactic Sugar für Listen und Tuppel if-guards def domatch(a:any) = a match { case x::y::10::rest => "1" case (x:int, y:int) if (x+y == 10) => "2" case (x,_) => "3" println(domatch(list(1,2,10,4,5))) println(domatch((4, 6))) println(domatch(("hello", 1)))

Pattern Matching Mittels case können eigene Klassen erstellt werden die mittels Pattern Matching zerlegt werden können case class Person(var name:string, var age:int) def domatch(p:person) = p match { case Person(n, a) if (a < 18) => "young:"+n case Person(n, _) => "adult:"+n println(domatch(person("tim", 5))) println(domatch(person("jan", 33)))

Pattern Matching abstract class Expr case class Const(v:Int) extends Expr case class Mul(e1:Expr, e2:expr) extends Expr case class Add(e1:Expr, e2:expr) extends Expr def interp(e:expr):int = e match { case Const(v) => v case Mul(e1, e2) => interp(e1) * interp(e2) case Add(e1, e2) => interp(e1) + interp(e2) val e = Add(Mul(Const(2),Const(6)),Add(Const(3),Const(4))) println(interp(e))

Pattern Matching def opt(e:expr):expr = e match { case Mul(e1,e2) if e1==const(0) e2==const(0) => Const(0) case Mul(Const(1), x) => x case Mul(x, Const(1)) => x case Mul(e1, e2) => Mul(opt(e1), opt(e2)) case Add(e1, e2) => Add(opt(e1), opt(e2)) case x:const => x val e1 = Add(Mul(Const(2), Const(1)), Add(Const(3), Const(4))) val e2 = Add(Mul(Const(2), Const(0)), Add(Const(3), Const(4))) println(opt(e1)) // Add(Const(2),Add(Const(3),Const(4))) println(opt(e2)) // Add(Const(0),Add(Const(3),Const(4)))

Die apply Methode Impliziter Aufruf der apply Methode, wenn ein Ausdruck der Form: obj(param) bzw. obj(p1,p2,...) gefunden wurde val a = Array("hello", "world") println(a(0)) entspricht val a = Array.apply("hello", "world") println(a.apply(0))

First Class Functions Funktionen sind auch nur Objekte und können daher wie ganz normale Werte herumgereicht werden val mul = (x:int, y:int) => x * y val multiply = mul println(multiply(3, 4))

Higher-Order Functions Funktionen die andere Funktionen als Parameter entgegennehmen oder Funktionen als Rückgabewerte zurückliefern def sumf(f:int=>int, x:int, y:int):int = if (x > y) 0 else f(x) + sumf(f, x+1, y) def square(x:int) = x * x println(sumf(identity, 1, 3)) println(sumf(square, 1, 3)) println(sumf(x => x * x, 1, 3))

Tail-Rekursion Die JVM bietet leider keine Unterstützung für Tail- Calls der Scala Compiler kann jedoch einfache Tail-Rekursive Aufrufe zu Schleifen optimieren def sumf(f:int=>int,x:int,y:int,a:int):int = if(x > y) a else sumf(f, x+1, y, a + f(x)) println(sumf(identity, 1, 3, 0))

Currying Zurückliefern einer inneren Funktion def sumf(f:int=>int):(int,int)=>int = { def anosumf(x:int, y:int):int = if (x>y) 0 else f(x) + anosumf(x+1,y) anosumf println((sumf(identity)) (1, 3)) Funktions-Applikation ist linksassoziativ println(sumf(identity) (1, 3))

Currying Spezielle Syntax erspart uns die innere Funktion def sumf(f:int=>int)(x:int, y:int):int = if (x>y) 0 else f(x) + sumf(f)(x+1, y) println(sumf(identity)(1,3)) Underscore Notation def sumints = sumf(identity) _ println(sumints(1,3))

Call-by-Value vs Call-by-Name Call-by-Value def eagerfoo(bar:int) = { println("eager"); bar + 1 println(eagerfoo({println("arg"); 1)) Call-by-Name def lazyfoo(bar: =>Int) = { println("lazy"); bar + 1 println(lazyfoo({println("arg"); 1))

Eigene Kontrollstrukturen def whileloop(cond: =>Boolean)(body: =>Unit):Unit = if (cond) { body whileloop(cond)(body) var i = 10 whileloop (i > 0) { println(i) i -= 1

Eigene Kontrollstrukturen 2 class LoopUnlessCond(body: => Unit) { def unless(cond: => Boolean):Unit = { body if (!cond) unless(cond) def loop(body: => Unit): LoopUnlessCond = new LoopUnlessCond(body) var i = 10 loop { println(i) i -= 1 unless (i == 0)

For Comprehensions Funktionieren ähnlich wie eine Query-Language Iteration über eine oder mehrere Sequenzen Anwendung von Filtern Rückgabe einer neuen Sequenz for (i <- 1 to 10 if i % 2 == 0) yield i + 1 intern werden die Higher-Order Functions map, flatmap, und filter for (i <- 1 until 10 if i % 2!= 0) println(i) bzw. foreach aufgerufen

For Comprehensions case class Team(val name:string, val score:int) val teams = List(Team("Wookies", 7), Team("Ewoks", 4), Team("Sith", 6)) for (t1 <- teams; t2 <- teams if t1!= t2 && t1.score > t2.score) println(t1.name + " defeated " + t2.name) Output Wookies defeated Ewoks Wookies defeated Sith Sith defeated Ewoks

Vielen Dank! Jan Hermanns www.sushi3003.de