Clojure - Sintassi di base

Per comprendere la sintassi di base di Clojure, diamo prima un'occhiata a un semplice programma Hello World.

Hello World come programma completo

Scrivi "Hello world" in un programma Clojure completo. Di seguito è riportato un esempio.

Esempio

(ns clojure.examples.hello
   (:gen-class))
(defn hello-world []
   (println "Hello World"))
(hello-world)

Le seguenti cose devono essere annotate sul programma di cui sopra.

  • Il programma verrà scritto in un file chiamato main.clj. L'estensione "clj" è il nome dell'estensione per un file di codice clojure. Nell'esempio sopra, il nome del file si chiama main.clj.

  • La parola chiave "defn" viene utilizzata per definire una funzione. Vedremo le funzioni in dettaglio in un altro capitolo. Ma per ora, sappi che stiamo creando una funzione chiamata helloworld, che avrà il nostro codice Clojure principale.

  • Nel nostro codice Clojure, stiamo usando l'istruzione 'println' per stampare "Hello World" nell'output della console.

  • Chiamiamo quindi la funzione hello-world che a sua volta esegue l'istruzione "println".

Il programma precedente produce il seguente output.

Produzione

Hello World

Forma generale di una dichiarazione

La forma generale di qualsiasi istruzione deve essere valutata tra parentesi graffe come mostrato nell'esempio seguente.

(+ 1 2)

Nell'esempio precedente, l'intera espressione è racchiusa tra parentesi graffe. L'output dell'istruzione precedente è 3. L'operatore + agisce come una funzione in Clojure, che viene utilizzata per l'aggiunta di numeri. I valori di 1 e 2 sono noti come parameters to the function.

Consideriamo un altro esempio. In questo esempio, "str" ​​è l'operatore utilizzato per concatenare due stringhe. Le stringhe "Hello" e "World" vengono utilizzate come parametri.

(str "Hello" "World")

Esempio

Se combiniamo le due affermazioni precedenti e scriviamo un programma, apparirà come segue.

(ns clojure.examples.hello
   (:gen-class))
(defn Example []
   (println (str "Hello World"))
   (println (+ 1 2)))
(Example)

Produzione

Il programma precedente produce il seguente output.

Hello World
3

Spazi dei nomi

Uno spazio dei nomi viene utilizzato per definire un confine logico tra i moduli definiti in Clojure.

Spazio dei nomi corrente

Questo definisce lo spazio dei nomi corrente in cui risiede il codice Clojure corrente.

Sintassi

*ns*

Esempio

Nella finestra dei comandi REPL eseguire il seguente comando.

*ns*

Produzione

Quando eseguiamo il comando precedente, l'output differirà a seconda di quale sia lo spazio dei nomi corrente. Di seguito è riportato un esempio di output. Lo spazio dei nomi del codice Clojure è -

clojure.examples.hello

(ns clojure.examples.hello
   (:gen-class))
(defn Example []
   (println (str "Hello World"))
   (println (+ 1 2)))
(Example)

Richiedi dichiarazione in Clojure

Il codice Clojure è confezionato in librerie. Ogni libreria Clojure appartiene a uno spazio dei nomi, che è analogo a un pacchetto Java. Puoi caricare una libreria Clojure con l'istruzione "Require".

Sintassi

(require quoted-namespace-symbol)

Esempio

Di seguito è riportato un esempio di utilizzo di questa dichiarazione.

(ns clojure.examples.hello
   (:gen-class))
(require ‘clojure.java.io’)
(defn Example []
   (.exists (file "Example.txt")))
(Example)

Nel codice sopra, stiamo usando la parola chiave 'require' per importare lo spazio dei nomi clojure.java.io che ha tutte le funzioni richieste per la funzionalità di input / output. Poiché non abbiamo la libreria richiesta, possiamo usare la funzione 'file' nel codice sopra.

Commenti in Clojure

I commenti vengono utilizzati per documentare il codice. I commenti su una sola riga vengono identificati utilizzando il ;; in qualsiasi posizione della linea. Di seguito è riportato un esempio.

Esempio

(ns clojure.examples.hello
   (:gen-class))

;; This program displays Hello World
(defn Example []
   (println "Hello World"))
(Example)

Delimitatori

In Clojure, le affermazioni possono essere divise o delimitate utilizzando le parentesi graffe curve o quadre.

Esempio

Di seguito sono riportati due esempi.

(ns clojure.examples.hello
   (:gen-class))

;; This program displays Hello World
(defn Example []
   (println (+ 1 2 3)))
(Example)

Produzione

Il programma precedente produce il seguente output.

6

Esempio

Di seguito è riportato un altro esempio.

(ns clojure.examples.hello
   (:gen-class))

;; This program displays Hello World
(defn Example []
   (println [+ 1 2 3]))
(Example)

Produzione

Il programma precedente produce il seguente output.

[#object[clojure.core$_PLUS_ 0x10f163b "[email protected]"] 1 2 3]

Spazi bianchi

Gli spazi bianchi possono essere utilizzati in Clojure per dividere diversi componenti di un'istruzione per una migliore chiarezza. Questo può essere fatto con l'assistenza dell'operatore virgola (,).

Ad esempio, le due istruzioni seguenti sono equivalenti e l'output di entrambe le istruzioni sarà 15.

(+ 1 2 3 4 5)
(+ 1, 2, 3, 4, 5)

Sebbene Clojure ignori le virgole, a volte le usa per rendere le cose più facili da leggere per il programmatore.

Ad esempio, se hai una mappa hash come la seguente (def a-map {: a 1: b 2: c 3}) e chiedi il suo valore nella finestra REPL, Clojure stamperà l'output come {: a 1, : b 2,: c 3}.

I risultati sono più facili da leggere, soprattutto se stai esaminando una grande quantità di dati.

Simboli

In Clojure, i simboli sono equivalenti agli identificatori in altri linguaggi di programmazione. Ma a differenza di altri linguaggi di programmazione, il compilatore vede i simboli come valori stringa effettivi. Poiché un simbolo è un valore, un simbolo può essere memorizzato in una raccolta, passato come argomento a una funzione, ecc., Proprio come qualsiasi altro oggetto.

Un simbolo può contenere solo caratteri alfanumerici e '* +! /. : - _? ' ma non deve iniziare con un numero o due punti.

Di seguito sono riportati validi esempi di simboli.

tutorial-point!
TUTORIAL
+tutorial+

Struttura del progetto Clojure

Infine parliamo di una tipica struttura di progetto per un progetto Clojure. Poiché il codice Clojure viene eseguito su Java virtual machine, la maggior parte della struttura del progetto all'interno di Clojure è simile a quella che si troverebbe in un progetto java. Di seguito è riportata l'istantanea di una struttura di progetto di esempio in Eclipse per un progetto Clojure.

Le seguenti cose fondamentali devono essere annotate sulla struttura del programma di cui sopra.

  • demo_1 - Questo è il pacchetto in cui viene inserito il file di codice Clojure.

  • core.clj - Questo è il file di codice Clojure principale, che conterrà il codice per l'applicazione Clojure.

  • La cartella Leiningen contiene file come clojure-1.6.0.jar, necessario per eseguire qualsiasi applicazione basata su Clojure.

  • Il file pom.properties conterrà informazioni come groupId, artifactId e la versione del progetto Clojure.

  • Il file project.clj contiene informazioni sull'applicazione Clojure stessa. Di seguito è riportato un esempio del contenuto del file di progetto.

(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"]])