Clojure - Grundlegende Syntax
Um die grundlegende Syntax von Clojure zu verstehen, schauen wir uns zunächst ein einfaches Hello World-Programm an.
Hallo Welt als komplettes Programm
Schreiben Sie 'Hallo Welt' in ein vollständiges Clojure-Programm. Es folgt ein Beispiel.
Beispiel
(ns clojure.examples.hello
(:gen-class))
(defn hello-world []
(println "Hello World"))
(hello-world)
Die folgenden Dinge müssen über das obige Programm beachtet werden.
Das Programm wird in eine Datei namens main.clj geschrieben. Die Erweiterung 'clj' ist der Erweiterungsname für eine Clojure-Codedatei. Im obigen Beispiel heißt der Name der Datei main.clj.
Das Schlüsselwort 'defn' wird verwendet, um eine Funktion zu definieren. Wir werden Funktionen in Details in einem anderen Kapitel sehen. Aber jetzt wissen Sie, dass wir eine Funktion namens helloworld erstellen, die unseren Clojure-Hauptcode enthält.
In unserem Clojure-Code verwenden wir die Anweisung 'println', um "Hello World" in die Konsolenausgabe zu drucken.
Wir rufen dann die Hallo-Welt-Funktion auf, die wiederum die Anweisung 'println' ausführt.
Das obige Programm erzeugt die folgende Ausgabe.
Ausgabe
Hello World
Allgemeine Form einer Erklärung
Die allgemeine Form einer Anweisung muss in Klammern angegeben werden, wie im folgenden Beispiel gezeigt.
(+ 1 2)
Im obigen Beispiel ist der gesamte Ausdruck in geschweiften Klammern eingeschlossen. Die Ausgabe der obigen Anweisung ist 3. Der Operator + verhält sich wie eine Funktion in Clojure, die zum Hinzufügen von Ziffern verwendet wird. Die Werte von 1 und 2 sind bekannt als parameters to the function.
Betrachten wir ein anderes Beispiel. In diesem Beispiel ist 'str' der Operator, mit dem zwei Zeichenfolgen verkettet werden. Die Zeichenfolgen "Hallo" und "Welt" werden als Parameter verwendet.
(str "Hello" "World")
Beispiel
Wenn wir die beiden obigen Anweisungen kombinieren und ein Programm schreiben, sieht es wie folgt aus.
(ns clojure.examples.hello
(:gen-class))
(defn Example []
(println (str "Hello World"))
(println (+ 1 2)))
(Example)
Ausgabe
Das obige Programm erzeugt die folgende Ausgabe.
Hello World
3
Namespaces
Ein Namespace wird verwendet, um eine logische Grenze zwischen in Clojure definierten Modulen zu definieren.
Aktueller Namespace
Dies definiert den aktuellen Namespace, in dem sich der aktuelle Clojure-Code befindet.
Syntax
*ns*
Beispiel
Führen Sie im REPL-Befehlsfenster den folgenden Befehl aus.
*ns*
Ausgabe
Wenn wir den obigen Befehl ausführen, wird die Ausgabe abhängig vom aktuellen Namespace verschoben. Das Folgende ist ein Beispiel für eine Ausgabe. Der Namespace des Clojure-Codes lautet -
clojure.examples.hello
(ns clojure.examples.hello
(:gen-class))
(defn Example []
(println (str "Hello World"))
(println (+ 1 2)))
(Example)
Erklärung in Clojure erforderlich
Clojure-Code ist in Bibliotheken verpackt. Jede Clojure-Bibliothek gehört zu einem Namespace, der einem Java-Paket entspricht. Sie können eine Clojure-Bibliothek mit der Anweisung 'Require' laden.
Syntax
(require quoted-namespace-symbol)
Beispiel
Das Folgende ist ein Beispiel für die Verwendung dieser Anweisung.
(ns clojure.examples.hello
(:gen-class))
(require ‘clojure.java.io’)
(defn Example []
(.exists (file "Example.txt")))
(Example)
Im obigen Code verwenden wir das Schlüsselwort 'require', um den Namespace clojure.java.io zu importieren, der alle für die Eingabe- / Ausgabefunktionalität erforderlichen Funktionen enthält. Da wir nicht über die erforderliche Bibliothek verfügen, können wir die Funktion 'Datei' im obigen Code verwenden.
Kommentare in Clojure
Kommentare werden verwendet, um Ihren Code zu dokumentieren. Einzeilige Kommentare werden mit dem ;; an jeder Position in der Linie. Es folgt ein Beispiel.
Beispiel
(ns clojure.examples.hello
(:gen-class))
;; This program displays Hello World
(defn Example []
(println "Hello World"))
(Example)
Trennzeichen
In Clojure können Anweisungen mithilfe der geschweiften oder eckigen Klammern geteilt oder abgegrenzt werden.
Beispiel
Es folgen zwei Beispiele.
(ns clojure.examples.hello
(:gen-class))
;; This program displays Hello World
(defn Example []
(println (+ 1 2 3)))
(Example)
Ausgabe
Das obige Programm erzeugt die folgende Ausgabe.
6
Beispiel
Es folgt ein weiteres Beispiel.
(ns clojure.examples.hello
(:gen-class))
;; This program displays Hello World
(defn Example []
(println [+ 1 2 3]))
(Example)
Ausgabe
Das obige Programm erzeugt die folgende Ausgabe.
[#object[clojure.core$_PLUS_ 0x10f163b "clojure.core$_PLUS_@10f163b"] 1 2 3]
Leerzeichen
In Clojure können Leerzeichen verwendet werden, um verschiedene Komponenten einer Anweisung zur besseren Übersichtlichkeit aufzuteilen. Dies kann mit Hilfe des Kommas (,) erfolgen.
Zum Beispiel sind die folgenden zwei Anweisungen äquivalent und die Ausgabe beider Anweisungen ist 15.
(+ 1 2 3 4 5)
(+ 1, 2, 3, 4, 5)
Obwohl Clojure Kommas ignoriert, werden sie manchmal verwendet, um dem Programmierer das Lesen zu erleichtern.
Wenn Sie beispielsweise eine Hash-Map wie die folgende haben (def a-map {: a 1: b 2: c 3}) und im REPL-Fenster nach ihrem Wert fragen, druckt Clojure die Ausgabe als {: a 1, : b 2 ,: c 3}.
Die Ergebnisse sind leichter zu lesen, insbesondere wenn Sie eine große Datenmenge betrachten.
Symbole
In Clojure entsprechen Symbole Bezeichnern in anderen Programmiersprachen. Im Gegensatz zu anderen Programmiersprachen sieht der Compiler Symbole jedoch als tatsächliche Zeichenfolgenwerte. Da ein Symbol ein Wert ist, kann ein Symbol wie jedes andere Objekt in einer Sammlung gespeichert, als Argument an eine Funktion usw. übergeben werden.
Ein Symbol darf nur alphanumerische Zeichen und '* +! /. : - _? ' darf aber nicht mit einer Ziffer oder einem Doppelpunkt beginnen.
Es folgen gültige Beispiele für Symbole.
tutorial-point!
TUTORIAL
+tutorial+
Clojure Projektstruktur
Lassen Sie uns abschließend über eine typische Projektstruktur für ein Clojure-Projekt sprechen. Da Clojure-Code auf einer virtuellen Java-Maschine ausgeführt wird, ähnelt der größte Teil der Projektstruktur in Clojure dem, was Sie in einem Java-Projekt finden würden. Es folgt die Momentaufnahme einer Beispielprojektstruktur in Eclipse für ein Clojure-Projekt.
Die folgenden wichtigen Dinge müssen über die obige Programmstruktur beachtet werden.
demo_1 - Dies ist das Paket, in dem die Clojure-Codedatei abgelegt wird.
core.clj - Dies ist die Haupt-Clojure-Codedatei, die den Code für die Clojure-Anwendung enthält.
Der Ordner Leiningen enthält Dateien wie clojure-1.6.0.jar, die zum Ausführen einer Clojure-basierten Anwendung erforderlich sind.
Die Datei pom.properties enthält Informationen wie die Gruppen-ID, die Artefakt-ID und die Version des Clojure-Projekts.
Die Datei project.clj enthält Informationen zur Clojure-Anwendung. Im Folgenden finden Sie ein Beispiel für den Inhalt der Projektdatei.
(defproject demo-1 "0.1.0-SNAPSHOT"
:description "FIXME: write description"
:url "http://example.com/FIXME"
:license {
:name "Eclipse Public License"
:url "http://www.eclipse.org/legal/epl-v10.html"
}
:dependencies [[org.clojure/clojure "1.6.0"]])