Clojure - Syntaxe de base

Afin de comprendre la syntaxe de base de Clojure, examinons d'abord un simple programme Hello World.

Hello World en tant que programme complet

Écrivez «Hello world» dans un programme Clojure complet. Voici un exemple.

Exemple

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

Les choses suivantes doivent être notées à propos du programme ci-dessus.

  • Le programme sera écrit dans un fichier appelé main.clj. L'extension 'clj' est le nom d'extension d'un fichier de code clojure. Dans l'exemple ci-dessus, le nom du fichier s'appelle main.clj.

  • Le mot clé 'defn' est utilisé pour définir une fonction. Nous verrons les fonctions en détail dans un autre chapitre. Mais pour l'instant, sachez que nous créons une fonction appelée helloworld, qui aura notre principal code Clojure.

  • Dans notre code Clojure, nous utilisons l'instruction 'println' pour imprimer «Hello World» sur la sortie de la console.

  • Nous appelons ensuite la fonction hello-world qui à son tour exécute l'instruction 'println'.

Le programme ci-dessus produit la sortie suivante.

Production

Hello World

Forme générale d'une déclaration

La forme générale de toute instruction doit être évaluée entre accolades, comme illustré dans l'exemple suivant.

(+ 1 2)

Dans l'exemple ci-dessus, l'expression entière est placée entre accolades. La sortie de l'instruction ci-dessus est 3. L'opérateur + agit comme une fonction dans Clojure, qui est utilisée pour l'addition de chiffres. Les valeurs de 1 et 2 sont appelées parameters to the function.

Prenons un autre exemple. Dans cet exemple, «str» est l'opérateur utilisé pour concaténer deux chaînes. Les chaînes «Hello» et «World» sont utilisées comme paramètres.

(str "Hello" "World")

Exemple

Si nous combinons les deux instructions ci-dessus et écrivons un programme, il ressemblera à ce qui suit.

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

Production

Le programme ci-dessus produit la sortie suivante.

Hello World
3

Espaces de noms

Un espace de noms est utilisé pour définir une frontière logique entre les modules définis dans Clojure.

Espace de noms actuel

Cela définit l'espace de noms actuel dans lequel réside le code Clojure actuel.

Syntaxe

*ns*

Exemple

Dans la fenêtre de commande REPL, exécutez la commande suivante.

*ns*

Production

Lorsque nous exécutons la commande ci-dessus, la sortie sera différée en fonction de l'espace de noms actuel. Voici un exemple de sortie. L'espace de noms du code Clojure est -

clojure.examples.hello

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

Exiger une déclaration dans Clojure

Le code Clojure est emballé dans des bibliothèques. Chaque bibliothèque Clojure appartient à un espace de noms, qui est analogue à un package Java. Vous pouvez charger une bibliothèque Clojure avec l'instruction 'Require'.

Syntaxe

(require quoted-namespace-symbol)

Exemple

Voici un exemple de l'utilisation de cette instruction.

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

Dans le code ci-dessus, nous utilisons le mot-clé 'require' pour importer l'espace de noms clojure.java.io qui a toutes les fonctions requises pour la fonctionnalité d'entrée / sortie. Puisque nous n'avons pas la bibliothèque requise, nous pouvons utiliser la fonction «fichier» dans le code ci-dessus.

Commentaires dans Clojure

Les commentaires sont utilisés pour documenter votre code. Les commentaires sur une seule ligne sont identifiés à l'aide du symbole ;; à n'importe quelle position de la ligne. Voici un exemple.

Exemple

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

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

Délimiteurs

Dans Clojure, les instructions peuvent être fractionnées ou délimitées en utilisant les accolades courbes ou carrées.

Exemple

Voici deux exemples.

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

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

Production

Le programme ci-dessus produit la sortie suivante.

6

Exemple

Voici un autre exemple.

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

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

Production

Le programme ci-dessus produit la sortie suivante.

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

Espaces blancs

Les espaces peuvent être utilisés dans Clojure pour séparer les différents composants d'une instruction pour une meilleure clarté. Cela peut être fait à l'aide de l'opérateur virgule (,).

Par exemple, les deux instructions suivantes sont équivalentes et la sortie des deux instructions sera 15.

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

Bien que Clojure ignore les virgules, il les utilise parfois pour rendre les choses plus faciles à lire pour le programmeur.

Par exemple, si vous avez une carte de hachage comme celle-ci (def a-map {: a 1: b 2: c 3}) et demandez sa valeur dans la fenêtre REPL, Clojure affichera la sortie comme {: a 1, : b 2,: c 3}.

Les résultats sont plus faciles à lire, surtout si vous consultez une grande quantité de données.

Symboles

Dans Clojure, les symboles sont équivalents aux identifiants dans d'autres langages de programmation. Mais contrairement aux autres langages de programmation, le compilateur considère les symboles comme des valeurs de chaîne réelles. Comme un symbole est une valeur, un symbole peut être stocké dans une collection, passé en argument à une fonction, etc., comme tout autre objet.

Un symbole ne peut contenir que des caractères alphanumériques et '* +! /. : - _? ' mais ne doit pas commencer par un chiffre ou deux points.

Voici des exemples valides de symboles.

tutorial-point!
TUTORIAL
+tutorial+

Structure du projet Clojure

Enfin, parlons d'une structure de projet typique pour un projet Clojure. Puisque le code Clojure s'exécute sur une machine virtuelle Java, la plupart de la structure du projet dans Clojure est similaire à ce que vous trouveriez dans un projet java. Voici un instantané d'un exemple de structure de projet dans Eclipse pour un projet Clojure.

Les éléments clés suivants doivent être notés concernant la structure du programme ci-dessus.

  • demo_1 - Il s'agit du package dans lequel le fichier de code Clojure est placé.

  • core.clj - Il s'agit du fichier de code Clojure principal, qui contiendra le code de l'application Clojure.

  • Le dossier Leiningen contient des fichiers comme clojure-1.6.0.jar qui sont nécessaires pour exécuter toute application basée sur Clojure.

  • Le fichier pom.properties contiendra des informations telles que le groupId, artifactId et la version du projet Clojure.

  • Le fichier project.clj contient des informations sur l'application Clojure elle-même. Voici un exemple du contenu du fichier de projet.

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