Open Source im professionellen Einsatz
Linux-Magazin 04/2014
© Galina Peshkova, 123RF.com

© Galina Peshkova, 123RF.com

Webanwendungen in Clojure schreiben

Web funktional

Clojure sieht aus wie Lisp und läuft überall, wo Java installiert ist. Dank praktischer Tools und ausgereifter Bibliotheken ist mit der Sprache auch rasch eine moderne Webanwendung programmiert.

653

Im Jahr 2007 tauchte Clojure [1] in der Softwarelandschaft auf. Die funktionale Programmiersprache vereint Lisp-artige Syntax mit einer Implementierung auf der Java Virtual Machine (JVM). Binnen weniger Jahre hat sich eine Clojure-Community mit Usergroups [2] und Konferenzen wie der Euro Clojure [3] gebildet.

Für die unter der Eclipse Public License stehende Sprache ist ein umfangreiches Ökosystem von Bibliotheken entstanden. Zudem profitiert sie von ihrer Java-Basis, dank der sie sich die VM mit Java und JRuby teilen kann. Auf Multiprozessorsystemen glänzt sie durch Nebenläufigkeit [4]. Für Java steht auch das "j" im Namen, der sich sonst an das Programmierkonzept Closure anlehnt.

Clojure-Verfechter loben die überdurchschnittliche Produktivität, die die ausdrucksstarke Sprache erlaubt, und beziehen sich gerne auf einen Aufsatz des Lisp-Verfechters und Unternehmers Paul Graham [5]. Das alles hat mittlerweile einige Internet-Startups dazu bewogen, auf die Sprache zu setzen, sie verwenden sie in großen Webanwendungen. Dieser Artikel zeigt, wie man Clojure nutzt, um einen einfachen Chat für den Webbrowser umzusetzen (Abbildung 1).

Abbildung 1: Diese Chat-Anwendung lässt sich mit Clojure und Javascript umsetzen.

Bauen mit Leiningen

Die meisten Clojure-Nutzer setzen das Buildsystem Leiningen [6] ein, das sich auch um das Einspielen benötigter Bibliotheken kümmert. Wer es nicht in seinem Paketmanager findet, installiert es gemäß der Readme-Datei aus dem Quelltext. Das Kommando »lein -v« gibt die Leiningen-Version aus, beim ersten Aufruf lädt das Buildsystem noch ein paar Bibliotheken herunter und arbeitet eine Weile. Für diesen Artikel kam Version 2.3.4 zum Einsatz, daneben die jüngste stabile Clojure-Release 1.5.1 sowie Open JDK 7 als Java-Implementierung.

Das Projektverzeichnis für den Webchat legt das Kommando »lein new webapp« an und füllt es gleich mit einem Gerüst für die Anwendung. Abbildung 2 zeigt den Inhalt von »webapp« : Die Datei »project.clj« enthält Informationen über das Projekt und die Komponenten, die es benötigt – derzeit nur die aktuelle Clojure-Release.

Abbildung 2: Das Buildsystem Leiningen hat das Gerüst der Anwendung erzeugt.

Das Verzeichnis »src/« enthält den ersten Namespace der Anwendung »webapp.core« . Namespaces sind das wichtigste Mittel des Clojure-Programmierers, um Module mit unterschiedlichen Zuständigkeiten voneinander zu trennen. Dabei darf jeder Namespace alle oder einzelne Objekte in anderen referenzieren. Allerdings kann ein Namespace die Sichtbarkeit von Objekten nach außen durch »private« unterbinden.

Interaktiv: REPL

Die Datei »src/webapp/core.clj« enthält bereits eine Funktion. Sie lässt sich am interaktiven Kommandoprompt aufrufen, mit dem ein Clojure-Entwickler typischerweise neben dem Editor arbeitet. Wie in der Lisp-Familie üblich heißt die Eingabeaufforderung REPL (Read Eval Print Loop). Auf dem Terminal wechselt der Entwickler mit »cd« ins Projektverzeichnis und ruft dort »lein repl« auf.

Die folgende REPL-Sitzung nutzt die Funktion »require« , um den Code aus »src/webapp/core.clj« zu laden, und »in-ns« , um in den Namespace zu wechseln. Schließlich ruft sie die Funktion »foo« mit dem Argument »"It works!"« auf:

user=> (require 'webapp.core)
nil
user=> (in-ns 'webapp.core)
#<Namespace webapp.core>
webapp.core=> (foo "It works!")
It works! Hello, World!
nil

Eine einfache Änderung an der Quelltextdatei demonstriert, wie die REPL auf geänderten Code reagiert. In Listing 1 ist die Reihenfolge der Argumente in der »println« -Funktion vertauscht. Nach dem Abspeichern im Editor lädt man in derselben REPL nur den Namespace neu, um die geänderte Ausgabe zu erhalten:

Listing 1

src/webapp/core.clj

01 (defn foo
02   "I don't do a whole lot."
03   [x]
04   (println "Hello, World!" x))
webapp.core=> (require 'webapp.core :reload)
nil
webapp.core=> (foo "It works!")
Hello, World! It works!
nil

Diese Fähigkeit der REPL ermöglicht es dem Entwickler, fortlaufend seine Änderungen am Code auszuprobieren. Viele Editoren wie Vim oder Emacs können eine REPL integrieren.

Diesen Artikel als PDF kaufen

Express-Kauf als PDF

Umfang: 6 Heftseiten

Preis € 0,99
(inkl. 19% MwSt.)

Linux-Magazin kaufen

Einzelne Ausgabe
 
Abonnements
 
TABLET & SMARTPHONE APPS
Bald erhältlich
Get it on Google Play

Deutschland

Ähnliche Artikel

  • Clojure 1.6 stabilisiert Alpha-Features

    Die funktionale, Java-basierte Programmiersprache Clojure, die sich an Lisp orientiert, ist in Version 1.6 erschienen. Einige vormalige Alpha-Features sind nun den Kinderschuhen entwachsen.

  • Nebenläufig

    Die Welt der Programmiersprachen hat seit zwei Jahren eine neue Bewohnerin: Die funktionale Sprache Clojure spezialisiert sich auf Programme mit Multithreading und bietet dank Java-Verwandtschaft trotz ihres jugendlichen Alters eine umfangreiche Bibliotheken-Landschaft.

  • Tux liest

    Das Linux-Magazin nimmt ein englischsprachiges Buch unter die Lupe, das sich mit Ubuntu Server beschäftigt und das Etikett "offizielles Handbuch" trägt. Der zweite Titel ist in Deutsch abgefasst und widmet sich der funktionalen Programmiersprache Clojure.

     

  • Unabhängigkeit: Clojure will ohne Spenden auskommen

    Der Erfinder des Lisp-Dialekts Clojure will sein Projekt künftig ohne Spenden weiterführen.

  • Riemann

    Spätestens dann, wenn eine Monitoring-Software auf den Ausfall eines Dienstes oder Servers hinweist, sind Systemverwalter gefragt. Im Gegensatz zu diesem reaktiven Ansatz ermöglicht es proaktives Monitoring, Probleme im Vorfeld zu erkennen.

comments powered by Disqus

Ausgabe 09/2017

Artikelserien und interessante Workshops aus dem Magazin können Sie hier als Bundle erwerben.