Nachdem man immer mal wieder (manche sagen: jedes Jahr) eine neue Programmiersprache lernen soll und Clojure sich nicht hinreichend von Common Lisp unterscheidet, um wirklich sagen zu können, daß ich dem in letzter Zeit nachgekommen sei, habe ich beschlossen, mir die Sprache Scala ein wenig anzusehen.

Mein bisheriger Eindruck ist recht gemischt, aber im Vergleich zum Mainstream schneidet Scala zweifelsohne gut ab.

Die Sprache wirkt insgesamt bemerkenswert mächtig, wenn man bedenkt, daß Scala sich von der Integration mit der JVM her viel stärker an Java orientiert, als beispielsweise Clojure das tut.

Aus diversen Quellen hört und liest man, daß Scala ein relativ mächtiges Typensystem besitze. In der Tat scheint die Typisierung ein paar interessante Merkmale aufzuweisen; jedoch muß ich mir das Typensystem erst genauer ansehen und ein bißchen damit herumspielen, um Konkreteres sagen zu können. Daß Traits unterstützt werden, ist aber auf jeden Fall schon mal ein Pluspunkt, und auch die impliziten Typenumwandlungen, die einem ganz unerwartete Dinge erlauben, passen gut in das Gesamtkonzept hinein.

Interessant ist auch, daß Scala ein Feature hat, das ich bislang nur aus diversen Lisps kenne und sonst noch nirgends entdecken konnte: dynamische Variablen. Ein Beispiel:

import scala.util.DynamicVariable  
 
val x = new DynamicVariable(0)  
 
def printx {  
  println(x.value)  
}  
 
printx               //=> 0  
x.withValue(100) {  
  printx             //=> 100  
  x.value = 50  
  printx             //=> 50  
}  
printx               //=> 0 

Die dynamischen Bindungen sind threadlokal und werden den Kindthreads vererbt, genau wie es sich gehört.

Natürlich stört mich das Fehlen eines Makrosystems. Die Scala-Anhänger glauben offenbar, ihre Sprache sei so flexibel, daß sie kein Makrosystem benötige. Das ist ein ziemlich weit verbreitetes Mißverständnis von Makrosystemen im allgemeinen, dem viele Anwender funktionaler Sprachen aufliegen. Man kann durchaus viele nützliche Muster funktional abstrahieren, für die man in weniger funktionalen Sprachen Makros benötigen würde, aber bei weitem nicht alle — ganz besonders nicht in einer funktional-objektorientierten Hybridsprache! —, und die Gefahr eines unbeschränkten, Code transformierenden Makrosystems wird gemeinhin auch maßlos überschätzt.

Andererseits sind funktionale Programmierung und programmierergesteuerte Spracherweiterungen eben Teile verschiedener Kulturen. Dazu werde ich in einem späteren Eintrag noch ein wenig mehr schreiben.