Drei neue Scala-Releases
Am 18. April wurden gleich [drei Releases angekündigt]((http://www.scala-lang.org/news/releases-1Q17.html).
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.
FeaturesWie ü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-AnnotationsMacro-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.
DebuggingAm 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.
LinksWer einen Eindruck von »Akka Typed« erhalten will kann sich die Blog-Reihe auf dem Akka-Blog anschauen, die bisher aus drei Artikeln besteht:
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.
Connectorenscalajs-bundler ermöglicht es NPM-Dependencies in scala.js via SBT anzubinden.
Bisherige LösungenNachdem 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.
LinksJetBrains 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.
LinksAuf der diesjährigen Google I/O hat Google Kotlin als offiziell unterstützte Programmiersprache für Android beworben.
LinksGib uns Dein Feedback als Kommentar auf unserer Web-Site, via Twitter oder Google+.
Kapitel
Scala Profis von Benjamin Hagemeister & Sven Wiegand ist lizenziert unter einer Creative Commons Namensnennung — Keine Bearbeitungen 4.0 International Lizenz.
Über diese Lizenz hinausgehende Erlaubnisse kannst Du unter http://scalaprofis.de erhalten.
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).