SP05/17: scala.meta und mehr
Drei neue Scala-Releases
Am 18. April wurden gleich [drei Releases angekündigt]((http://www.scala-lang.org/news/releases-1Q17.html).
- Scala 2.11.11: Letztes Release der 2.11er Reihe. Bugfixes. (Hinweis: 2.11.9 und 2.11.10 hat es nicht gegeben)
- Scala 2.12.2: Bringt neben diversen Fixes mit »Trailing Commas« (SIP-27) den ersten Proposal gemäß des überarbeiteten Scala Improvement Process‹.
- Scala 2.13.0‑M1: Basis für Modularisierung und Collection-Überarbeitung.
Links
4. Meeting des Scala Centers (Q1 2017)
Scala Center Aktivitäten
- Scastie:
- Wird als nützlich für Einsteiger und für die Community zum Teilen von Code-Schnippseln eingestuft.
- Bleibt in der Beta-Phase, bis Scala Center ausreichende Server-Ressourcen sichergestellt hat.
- 47 Degrees hat sich bereiterklärt bei der Bereitstellung eines brauchbaren UIs zu unterstützen.
- Zinc: Von den aktuellen Arbeiten werden sbt 1.0 und andere Build-Tools profitieren.
- Scalafix: Es besteht die Hoffnung, dass mehr und mehr Libraries Scalafix zur Migration auf neue Versionen einsetzen.
- Websites:
- 47 Degrees hat mehrere umfangreiche Pull-Requests zur Scala-Website gestellt, die hoffentlich bald gemergt werden.
- Ein externer Contractor arbeitet an den »Getting Started«- und »Language Tour«-Seiten.
- Scala.js:
- Scala.js ist stark am wachsen
- scalajs-bundler gewinnt ebenfalls an Interesse
- Scala Native: Läuft auf kleiner Flamme, bis Neueinstellung bereitsteht.
- Scaladex: Eine UI-Überarbeitung ist geplant, da das UI inzwischen etwas unaufgeräumt wirkt.
Sonstiges
- Community Builds: Arbeitet an einem Proposal zur Durchführung regelmäßiger Builds SBT-basierter Open-Source-Projekte um die Rückwärtskompatibilität von Neuentwicklungen im Scala-Compiler sicherzustellen.
Links
JNI mit ScalaNative
Links
Was ist scala.meta?
scala.meta ist ein Meta-Programming Toolkit für Scala. scala.meta wurde komplett neu implementiert und soll scala.reflect ersetzen.
Aktuell ist die Version 1.7 vom 11. April 2017. Geplant ist eigentlich ein Major Release (1.8, 1.9) am 10. von jedem Monat, eigentlich müsste es also schon die Version 1.8 geben.
scala.meta wird z.B. von scalafmt und von scalafix verwendet.
Features
- Parsing inkl. Format und Kommentaren
- Unterstützt verschiedene Dialekte (Scala 2.11, 2.12 und Dotty)
- Quasiquotes
- Macro-Annotations
- Verfügbar für
- Scala 2.11
- Scala 2.12
- Scala.js
Was bringt die Zukunft?
- Semantische API
- Inline Macros
- Support für
Dokumentation
Wie üblich gibt es leider bisher relativ wenig Dokumentation. Am hilfreichsten ist momentan ein Tutorial von Ólafur Pall Geirsson (A Whirlwind Tour of scala.meta).
Für Fragen kann man den scala.meta Gitter channel oder natürlich stackoverflow verwenden.
Beispiele findet man im Projekt Elysium auf GitHub.
Was ist besser?
scala.meta ist in der Verwendung deutlich einfacher als scala.reflect.
Für eine Macro-Annotation muss man eine Klasse von scala.annotation.StaticAnnotation
und eine apply
Methode implementieren, die dann für das Element (Objekt, Klasse, Methode, …) aufgerufen wird, an das die Annotation geschrieben wird:
class MyAnnotation extends scala.annotation.StaticAnnotation {
inline def apply(defn: Any): Any = meta {
defn match {
case obj: Defn.Object => ...
case cls: Defn.Class => ...
case _ => abort("@MyAnnotation is only allowed for classes and objects.")
}
}
}
Über das abort(...)
Statement erzeugt man einen compile Fehler.
Die AST-Objekte die man bekommt sind deutlich verständlicher, als bei scala.reflect.
Hier ein Beispiel aus Li Haoyis Sourcecode Bibliothek(Aus der Datei SourceContext.scala
:
object Util{
...
def getName(c: Compat.Context)(s: c.Symbol) = s.name.decoded.toString.trim
}
Die Funktion getName
gibt den Namen von einem übergebenen Symbol zurück.
Analog hier der Code um in der Annotation von oben zum Beispiel an den Namen einer Klasse zu kommen:
class MyAnnotation extends scala.annotation.StaticAnnotation {
inline def apply(defn: Any): Any = meta {
defn match {
case obj: Defn.Object => ...
case cls: Defn.Class =>
val className = cls.name.value
...
case _ => abort("@MyAnnotation is only allowed for classes and objects.")
}
}
}
Die übergebenen AST-Objekte sind case
Klassen. Wenn man etwas verändern will kann man per copy(...)
ein neues, angepasstes Objekt erzeugen und das dann zurück geben.
scala.meta und IntelliJ IDEA
Verwenden von Macro-Annotations
Macro-Annotation können in IDEA relativ problemlos verwendet werden. IDEA erkennt wenn ein Annotation an einer Stelle einen Compile-Fehler auslöst und zeigt den Code dann auch als Fehlerhaft an.
Neben der Annotation wird ein Symbol angezeigt über die das Macro ›ausgeführt‹ werden kann. IDEA ersetzt dann den vorhanden Code durch den, den das Macro generiert.
Das alles funktioniert allerdings nicht sonderlich gut für Macros die im gleichen IDEA Projekt entwickelt werden. Änderungen am Macro die neue Compile-Fehler erzeugen oder aktuelle Compile-Fehler beheben erkennt IDEA in der Regel nicht, womit dann unter Umständen korrekter Code als fehlerhaft angezeigt wird oder umgekehrt.
Debugging
Am einfachsten lässt sich ein Macro debuggen über Remote-Debugging.
Das hat bei Benjamin aber nicht immer zuverlässig funktioniert. Von Zeit zu Zeit wurde die Remote-Debugging-Session beendet und manchmal hat IDEA nicht an einem Break-Point angehalten.
Links
- scala.meta
- Changelog
- Quasiquotes
- Semantic Tooling at Twitter
- Macro Paradise
- scalafmt
- scalafix
- Meta-based def macros are coming
- A Whirlwind Tour of scala.meta
- scala.meta Gitter channel
- stackoverflow
- Elysium
- Debug Scala compiler plugin in IntelliJ IDEA
Akka Typed
Wer einen Eindruck von »Akka Typed« erhalten will kann sich die Blog-Reihe auf dem Akka-Blog anschauen, die bisher aus drei Artikeln besteht:
Alpakka
Alpakka ist ein von Lightbend initiiertes Sammelsurium von Akka-Stream-Connectoren, Integrations-Patterns und Daten-Transformationen für Integrations Use-Cases.
Ziel von Lightbend ist es mit Alpakka eine moderne Alternative zu Apache Camel zu schaffen.
Hier eine Liste der aktuell verfügbaren Komponenten.
Connectoren
- AMQP Connector
- AWS DynamoDB Connector
- AWS Lambda Connector
- AWS S3 Connector
- AWS SNS Connector
- AWS SQS Connector
- Cassandra Connector
- File Connectors
- FTP Connector
- Google Cloud Pub/Sub
- HBbase connector
- IronMq Connector
- JMS Connector
- MQTT Connector
- Server-sent Events (SSE) Connector
Externe Connectoren
- HTTP Client
- File IO
- Kafka
- TCP
- Azure
- Eventuate
- FS2
- Camel
- MongoDB
Daten-Transformationen
- Parsing Lines
- Comma-Separated Values — CSV
- RecordIO Framing
Links
scalajs-bundler
scalajs-bundler ermöglicht es NPM-Dependencies in scala.js via SBT anzubinden.
Bisherige Lösungen
- JS-Files ins Projekt kopieren und via
ProvidedJS
einbinden - WebJars
scalajs-bundler nutzen
Nachdem hinzufügen des SBT Plugins (und der lokalen Installation von NPM) können NPM-Dependencies einfach eingebunden werden:
npmDependencies in Compile += "snabbdom" -> "0.5.3"
Für sbt-web steht ebenfalls eine Variante des scalajs-bundlers bereit.
Links
Kotlin/Native
JetBrains hat eine Tech Preview für Kotlin/Native heraus gebracht. Genau wie Scala Native setzt Kotlin/Native auf LLVM um Kotlin-Code in nativ ausführbare Executables für verschiedene Plattformen zu übersetzen.
Links
Android Announces Support for Kotlin
Auf der diesjährigen Google I/O hat Google Kotlin als offiziell unterstützte Programmiersprache für Android beworben.
Links
Titelsong basierend auf Wish You Were Here von THE.MADPIX.PROJECT lizensiert unter Creative Commons Attribution-NonCommercial-ShareAlike 3.0 Unported (CC BY-NC-SA 3.0).