Ist Ruby funktional

Wenn die Liste der funktionalen Sprachen erstellt wird, dann tauchen Haskell, Scala, Erlang, F#, Clojure und einige andere Lisp-Varianten auf.

Wenn man sich anschaut, welche Merkmale funktionale Sprachen auszeichnen, dann stellt sich die Frage, ob das nicht alles mit Ruby auch machbar ist.

Schauen wir einmal was man so typischerweise findet, meist auf Englisch:

  • Functions as „first class citizen“
  • Closures
  • Pure Functions
  • Higher Order functions
  • Everything returns a value
  • Immutability
  • No hidden state
  • Prefer recursion over iteration (immutable loop variable…)

Funktionen existieren in Ruby also losgelöste Objekte, in verschiedenen Formen, z.B. als proc, als lambda, als anonymer Block und durch Referenzierung einer Methode über ihren Namen (Reflection).

Closures werden von Ruby problemlos unterstützt, bei all diesen Formen der Funktionen werden Variablen aus dem definierenden Kontext eingebunden, wo sie referenziert werden. Methoden kann man übrigens als Spezialfall von Closures ansehen, weil sie als Kontext das Objekt einbinden, zu dem sie gehören.

Unter „pure function“ versteht man Funktionen, die den Funktionen aus der Mathematik entsprechen. Sie haben absolut keinen Seiteneffekt, sind reproduzierbar, können in beliebiger Zahl parallel ausgeführt werden und geben bei mehrfachen Aufrufen immer dasselbe Resultat. Sie eignen sich für Memoize, was nun eigentlich wieder ein Seiteneffekt ist, aber sozusagen ein transparenter. Man denke an sort() und sort!() in Ruby. Dies verlangt Disziplin vom Entwickler und gute Dokumentation.

„Higher Order Functions“ sind Funktionen höherer Ordnung, die also selbst Funktionen als Parameter oder Rückgabewert haben. Das ist in der funktionalen Programmierung Routine und nicht so ein spezieller Spezialfall, den man mal alle paar Jahre benutzt, wie Funktionspointer in C. Typische Beispiele sind Methoden wie inject(), map(), group_by()… each() sollte man nur verwenden, wenn man die Seiteneffekte wirklich braucht.

Alle Ausdrücke haben einen Wert. Das ist recht gut in Ruby umgesetzt, z.B. x = if (...) ... else ... end kann man verwenden…

Immutibility (Unveränderbarkeit) ist die Achillesferse. Es wird nicht wirklich gut unterstützt. Man soll Variablen nicht neu zuweisen und auch nicht irgendwas mutieren. Warum nimmt man nicht freeze()? Wir brauchen ein deepfreeze(), aber was bedeutet das? Wie sieht es mit collections aus? Es gibt immer Möglichkeiten, diese unverändert zu lassen und mit jedem Schritt eine neue Collection zu produzieren. Dasselbe gilt für Zeichenketten.

„No hidden State“, also kein versteckter Zustand. Man kann Kontextobjekte haben und herumreichen. Zustand ist unerwünscht und sollte kontrolliert an wenigen Orten gehandhabt werden.

„Recursion instead of Iteration“ steht für Rekursion statt Iteration. Funktionale Sprachen unterstützen Optimierung bei Tailrekursion (Endrekursion). Einige andere Sprachen, z.B. C mit gcc, Scala und viele Lisp-Dialekte, aber nicht Java, unterstützen diese Optimierung und erlauben es, zumindest Endrekursion ohne zu große Furcht einzusetzen. Bei Ruby hängt es von der Version und den Einstellungen ab, ist also mit Vorsicht zu genießen. Der Ruby-Ansatz ist es eher, die Iteratorn zu verwenden.

Fazit: Man kann mit ein paar Einschränkungen in Ruby funktional programmieren, aber es erfordert etwas mehr Disziplin, weil einige Dinge vom Entwickler beachtet werden müssen und nicht von der Sprache unterstützt werden.

Share Button

Zufällige Zeichenkette erzeugen

Oft braucht man so eine zufällige Zeichenkette, die nur aus bestimmten Zeichen bestehen darf.

Hier ist eine einfache Ruby-implementierung dafür:


#!/usr/bin/ruby

arr = ('a'...'z').to_a + ('A'...'Z').to_a + ('0'...'9').to_a + ['.', '/']
val = (0..16).inject("") do |a, x| i = (arr.size() * rand()).to_i;a + arr[i] end
puts val

Es wird eine 16-Zeichen lange Zeichenkette generiert, die aus den Zeichen [a-zA-Z0-9./] besteht.

Share Button

Jolla Mobiltelefon

Bekanntlich hat sich die Firma Nokia erst aus ihren eigenen Entwicklungen bezüglich Mobiltelefonsoftware und später auch aus dem zugehörigen Hardwaregeschäft zurückgezogen und erlaubt einer Nordamerikanischen Firma für eine gewisse Zeit, ihre Telefone mit „Nokia“ zu benennen, etwa so wie für die Autofans „Volvo“ auf Autos steht, die sicher nicht von der seit vielen Jahren auf ihr Kerngeschäft, nämlich Lkws, Baumaschinen und Busse, spezialisierten Firma Volvo hergestellt werden. Nun hat Nokia in den letzten Jahren viele gute Mitarbeiter verloren, die im Bereich der Mobiltelefonentwicklung tätig waren. Diese haben dann eine neue Firma, „Jolla“, gegründet. Bis hier ist das alles normal, oft gründen entlassene oder frustriert selber gegangene ehemalige Mitarbeiter eine Firma, mit der sie das machen wollen, was sie bei ihrem alten Arbeitgeber machen wollten, aber nicht durften. Manche von diesen Firmen sind dann sehr erfolgreich, aber gleich das ehemalige Kerngeschäft der einst größten und wichtigsten Firma Europas in so einer Startup-Firma neu aufzubauen ist schon recht ehrgeizig und man musste es immer mit einer gewissen Skepsis betrachten. Auch wenn Jolla dort eher ein Nischenanbieter und nicht mehr wie einst Nokia und danach bis heute Samsung Marktführer ist.

Nun ist aber Jolla seit einigen Monaten so weit und man kann die Telefone bestellen, bezahlen und mit ihnen sogar telefonieren. Ich habe mir so eines beschafft und die Grundfunktionen sind auch vorhanden und ganz brauchbar. Die Benutzeroberfläche ist etwas gewöhnungsbedürftig, was aber eher daran liegt, dass wir die Oberfläche von Android-Geräten gewohnt sind und hier einige Dinge im Detail etwas anders laufen. Typisch ist, dass es eine Art virtuellen Bildschirm gibt und dass man Applikationen verlässt, indem man vom rechten Rand kommend auf den Bildschirm streicht. Das ist besonders gut zu wissen für das „Tutorial“, das irgendwie immer wieder bei Starten des Gerätes hochkommt und für das man keine einfache Art findet, um es zu verlassen. Ein anderes häufiges Element sind Punktreihen oben links, die irgendwie eine Tiefe im Dialog angeben und mit denen man zurück zur nächst höheren Ebene kommt. Menüs bekommt man oft, indem man von oben in den Bildschirm hereinstreicht. Alles drei Dinge, die Android mit drei spezifischen Tasten gelöst hat.

Nun soll man Apps installieren können. Dafür sollen sowohl Android-Apps vom Google-Play-Store als auch native in C++ & Qt geschriebene Apps vom Jolla-Eigenen App-Store verfügbar sein. Mehr dazu kommt vielleicht, wenn ich damit Erfahrungen gesammelt habe. Da Jolla wie Android auf Linux basiert, wäre vielleicht ein xterm und die ganzen GNU-Tools und so etwas schön. Es sollte möglich sein. Für Android gibt es das auch, aber da muss man wohl alles in Java nochmal schreiben, um es in eine App zu bringen. Was ja passiert ist, man hat Apps mit den wichtigsten GNU-Tools oder zumindest gleichnamigen Java-Attrappen. Auf dem N900 war das alles einfach nativ dabei, weil es mit dem Maemo-Linux mitkam.

Share Button

Laptopnetzteile

Bei Mobiltelefonen hat es endlich geklappt, dass alle Telefone denselben Anschluss für USB-Kabel und Ladegerät unterstützen. Fast alle, nämlich genaugenommen alle außer Apple. Aber die überwältigende Mehrheit der Mobiltelefone hat denselben Anschluss und funktioniert mit denselben Ladegeräten.

So etwas wäre bei Laptops auch schön. Tatsache ist aber, dass jeder Hersteller eine Vielfalt von Modellen hat, die sich noch laufend ändern, typischerweise auch innerhalb derselben Modellbezeichnung, und die auch jeweils spezifische Netzteile brauchen. Wenn man sein Netzteil vergessen hat und in einen großen Computerladen geht, kann man das selbstverständlich bestellen, aber die Chance, dass ein passendes Teil in dem Laden oder in einem anderen Laden in einer größeren Stadt (z.B. Zürich) direkt erhältlich ist, ist vernachlässigbar. Das war schon vor 10-15 Jahren so.

Es wäre wirklich gut, wenn sich wie beim Mobiltelefon die Hersteller auf einen Standard für Netzteile für alle Laptops (meinetwegen wieder alle bis auf einen Hersteller mit einem angebissenen-Obst-Logo) einigen könnten. Ich glaube, darüber würden sich viele Kunden freuen. Aber sie schaffen es ja heute nicht einmal innerhalb ihrer eigenen Marke, was angeblich der Hersteller mit halb gegessenen Apfel immerhin geschafft haben soll, zumindest mit einer größeren Adaptersammlung.

So werden wir also weiterhin viel Elektronikmüll produzieren, weil gute Netzteile in den Müll wandern, wenn der Laptop dazu kaputt ist, und wir werden weiterhin ein paar Stunden mit der Fahrt verbringen, wenn wir das Netzteil einmal vergessen haben.

Share Button