• Keine Ergebnisse gefunden

Was ist Meta-Programmierung?

N/A
N/A
Protected

Academic year: 2022

Aktie "Was ist Meta-Programmierung?"

Copied!
3
0
0

Wird geladen.... (Jetzt Volltext ansehen)

Volltext

(1)

Reaktive Programmierung

Vorlesung 9 vom 17.05.17: Meta-Programmierung

Christoph Lüth, Martin Ring Universität Bremen Sommersemester 2017

22:57:15 2017-06-06 1 [18]

Fahrplan

I Einführung

I Monaden als Berechnungsmuster I Nebenläufigkeit: Futures and Promises I Aktoren I: Grundlagen

I Aktoren II: Implementation I Bidirektionale Programmierung I Meta-Programmierung I Reaktive Ströme I I Reaktive Ströme II

I Functional Reactive Programming I Software Transactional Memory I Eventual Consistency I Robustheit und Entwurfsmuster I Theorie der Nebenläufigkeit, Abschluss

RP SS 2017 2 [18]

Was ist Meta-Programmierung?

“Programme höherer Ordnung” / Makros

Source Compiler Program

RP SS 2017 3 [18]

Was sehen wir heute?

I Anwendungsbeispiel: JSON Serialisierung

I Meta-Programmierung in Scala:

IScala Meta

I Meta-Programmierung in Haskell:

ITemplate Haskell

I Generische Programmierung in Scala und Haskell

RP SS 2017 4 [18]

Beispiel: JSON Serialisierung

Scala

case class Person(

names : L i s t [ String ] , age : Int

)

Haskell

data Person = Person { names :: [ String ] , age :: Int }

Ziel: Scala←−−−→JSON Haskell

RP SS 2017 5 [18]

JSON: Erster Versuch

JSON1.scala

I Unpraktisch: Für jeden Typ muss manuell eine Instanz erzeugt werden

I Idee: Makros for the win

RP SS 2017 6 [18]

Klassische Metaprogrammierung (Beispiel C)

#define square (n) ((n)∗(n) )

#define UpTo( i , n) for(( i ) = 0; ( i )<(n) ; ( i )++) UpTo( i ,10) {

p r i n t f (" i squared i s : %d\n", square ( i ) ) ; }

I Eigene Sprache: C Präprozessor

I Keine Typsicherheit: einfache String Ersetzungen

RP SS 2017 7 [18]

Metaprogrammierung in Scala: Scalameta

I Idee: Der Compiler ist im Programm verfügbar

>"x + 2∗ 7". parse [Term ] . get . structure

Term. ApplyInfix (Term.Name("x") , Term.Name("+") , Nil , Seq(Term. ApplyInfix ( L i t . Int (2) , Term.Name("∗") , Nil , Seq( L i t . Int (7) ) ) ) )

I Abstrakter syntaxbaum (AST) als algebraischer Datentyp→typsicher

I Sehr komplexer Datentyp . . .

RP SS 2017 8 [18]

(2)

Quasiquotations

I Idee: Programmcode statt AST I Zur Konstruktion . . .

>val p = q"case c l a s s Person(name: String ) "

p : meta . Defn . Class =case class Person(name: String ) I . . . und zur Extraktion

>val q"case c l a s s $name($param) "= p name: meta . Type .Name = Person

param : scala . meta .Term.Param = name: String

RP SS 2017 9 [18]

Makro Annotationen

I Idee: FunktionASTASTzur Compilezeit ausführen I Werkzeug: Annotationen

class h e l l o extends StaticAnnotation {

inline def apply ( defn : Any) : Any = meta { defnmatch{ caseq" object $name { . . $members }"⇒

q""" object $name { . . $members

def h e l l o : Unit = p r i n t l n ("Hello" ) }"""

case_⇒ abort ("@h e l l o must annotate an object ") } }

}

@h e l l o object Test

RP SS 2017 10 [18]

JSON: Zweiter Versuch

JSON2.scala

I Generische Ableitungen fürcase classes

I Funktioniert das für alle algebraischen Datentypen?

RP SS 2017 11 [18]

Generische Programmierung

I Beispiel: YAML statt JSON erzeugen

I Idee: Abstraktion über die Struktur von Definitionen

I Erster Versuch:ToMap. scala

IDas klappt so nicht . . .

IKeine geeignete Repräsentation!

RP SS 2017 12 [18]

Heterogene Listen

I Generische Abstraktion von Tupeln

>val l = 42 : : "foo" : : 4.3 : : HNil l : Int : : String : : Double : : HNil = . . .

I Viele Operationen normaler Listen vorhanden:

I Was ist der parameter fürflatMap?

⇒Polymorphe Funktionen

RP SS 2017 13 [18]

Records

I Uns fehlen namen I Dafür: Records

>import shapeless ._; record ._; import syntax . singleton ._

>val person = ("name"→>"Donald") : : ("age"→>"70") : : HNil

person : String withKeyTag[ String ("name") , String ] : : Int withKeyTag[ String ("age") , Int ] : : HNil = Donald : : 70 : : HNil

> person ("name") res1 : String = Donald

RP SS 2017 14 [18]

Die Typklasse Generic

I TypklasseGeneric [T]

t r a i t Generic [T] { type Repr

def from( r : Repr) : T def to ( t : T) : Repr }

I kann magisch abgeleitet werden:

>case class Person(name: String , age : Int )

>val gen = Generic [ Person ]

gen : shapeless . Generic [ Person ]{typeRepr = String : : Int : : shapeless . HNil} = . . .

I →Makro Magie

I Funktioniert allgemein für algebraische Datentypen

RP SS 2017 15 [18]

JSON Serialisierung: Teil 3

JSON3. scala

RP SS 2017 16 [18]

(3)

Automatische Linsen

case class Address( s t r e e t : String , c i t y : String , zip : Int ) case class Person(name: String , age : Int , address : Address) val streetLens = lens [ Person ] >> ’ address >> ’s t r e e t

RP SS 2017 17 [18]

Zusammenfassung

I Meta-Programmierung: “Programme Höherer Ordnung”

I Scalameta: Scala in Scala manipulieren I Quasiquotations: Reify and Splice

I Macros mit Scalameta:ASTASTzur Compilezeit

I Äquivalent in Haskell: TemplateHaskell

I Generische Programmierung in Shapeless I Äquivalent in Haskell: GHC.Generic

RP SS 2017 18 [18]

Referenzen

ÄHNLICHE DOKUMENTE

Wir freuen uns sehr darüber, dass wir es gemeinsam mit der letzten Landesregie- rung noch geschafft haben, dass in diesem Jahr alle Kolleg*innen, die zum Beförde- rungszeitpunkt

Motivation Program- miersprache Beispiele Semantik Interpreter- Design Ausblick Zusammen-

er selbst, mit Erfahrungen aus der Praxis, vom Lande und vertraut er sich diesen Monographien iiber Hacke, Haken, Pflug an, so wird er wahrscheinlich bald be merken, dafi

In jedem Fall war es nicht allein Josephus’ Idee, zwischen Worten und Taten als Modi der Bildungsvermittlung zu unterscheiden: Fast zeitgleich findet sich bei dem T heoretiker

In der Regel sollte es allen Prüflingen gelin- gen, sich nach dem Hören eines Textes zum Inhalt zu äußern. Hierbei können die unter- schiedlichsten Aufgabenformen angelegt werden,

Judith Anna Braunsteiner

Zivilgesellschaftliche Organisationen gründen sich, um Missstände zu been- den, die eine Gesellschaft hervor- bringt.. Zivilgesellschaftliche Organisa- tionen sind da zu finden,

Es besteht wohl kein Zweifel an der Tatsache, daß viele der heute mit einem sta- tionären Aufenthalt verbun- denen Operationen ambulant oder kurzzeit stationär durch- geführt