Clojure - podstawowa składnia

Aby zrozumieć podstawową składnię Clojure, przyjrzyjmy się najpierw prostemu programowi Hello World.

Hello World jako kompletny program

Napisz „Hello world” w kompletnym programie Clojure. Oto przykład.

Przykład

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

Na temat powyższego programu należy zwrócić uwagę na następujące kwestie.

  • Program zostanie zapisany w pliku o nazwie main.clj. Rozszerzenie „clj” to nazwa rozszerzenia pliku kodu clojure. W powyższym przykładzie nazwa pliku to main.clj.

  • Słowo kluczowe „defn” służy do definiowania funkcji. Szczegóły funkcji zobaczymy w innym rozdziale. Ale na razie wiedz, że tworzymy funkcję o nazwie helloworld, która będzie miała nasz główny kod Clojure.

  • W naszym kodzie Clojure używamy instrukcji „println” do wypisywania „Hello World” na wyjściu konsoli.

  • Następnie wywołujemy funkcję hello-world, która z kolei uruchamia instrukcję „println”.

Powyższy program generuje następujące dane wyjściowe.

Wynik

Hello World

Ogólna forma oświadczenia

Ogólną postać każdej instrukcji należy oceniać w nawiasach klamrowych, jak pokazano w poniższym przykładzie.

(+ 1 2)

W powyższym przykładzie całe wyrażenie jest zawarte w nawiasach. Wynik powyższej instrukcji to 3. Operator + działa jak funkcja w Clojure, która służy do dodawania liczb. Wartości 1 i 2 są znane jako parameters to the function.

Rozważmy inny przykład. W tym przykładzie „str” jest operatorem używanym do łączenia dwóch ciągów. Jako parametry używane są ciągi „Hello” i „World”.

(str "Hello" "World")

Przykład

Jeśli połączymy powyższe dwie instrukcje i napiszemy program, będzie on wyglądał następująco.

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

Wynik

Powyższy program generuje następujące dane wyjściowe.

Hello World
3

Przestrzenie nazw

Przestrzeń nazw służy do definiowania logicznej granicy między modułami zdefiniowanymi w Clojure.

Bieżąca przestrzeń nazw

Definiuje bieżącą przestrzeń nazw, w której znajduje się bieżący kod Clojure.

Składnia

*ns*

Przykład

W oknie polecenia REPL uruchom następujące polecenie.

*ns*

Wynik

Kiedy uruchomimy powyższe polecenie, dane wyjściowe zostaną odroczone w zależności od bieżącej przestrzeni nazw. Poniżej znajduje się przykład wyniku. Przestrzeń nazw kodu Clojure to -

clojure.examples.hello

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

Wymagaj oświadczenia w Clojure

Kod Clojure jest spakowany w bibliotekach. Każda biblioteka Clojure należy do przestrzeni nazw, która jest analogiczna do pakietu Java. Bibliotekę Clojure można załadować za pomocą instrukcji „Require”.

Składnia

(require quoted-namespace-symbol)

Przykład

Poniżej znajduje się przykład użycia tego oświadczenia.

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

W powyższym kodzie używamy słowa kluczowego „require” do importowania przestrzeni nazw clojure.java.io, która ma wszystkie funkcje wymagane do obsługi wejścia / wyjścia. Ponieważ nie mamy wymaganej biblioteki, możemy użyć funkcji „plik” w powyższym kodzie.

Komentarze w Clojure

Komentarze służą do dokumentowania Twojego kodu. Komentarze jednowierszowe są identyfikowane za pomocą ;; w dowolnym miejscu w linii. Oto przykład.

Przykład

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

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

Ograniczniki

W Clojure instrukcje można dzielić lub ograniczać za pomocą nawiasów kwadratowych lub zakrzywionych.

Przykład

Oto dwa przykłady.

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

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

Wynik

Powyższy program generuje następujące dane wyjściowe.

6

Przykład

Oto kolejny przykład.

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

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

Wynik

Powyższy program generuje następujące dane wyjściowe.

[#object[clojure.core$_PLUS_ 0x10f163b "clojure.core$_PLUS_@10f163b"] 1 2 3]

Białe spacje

W Clojure można używać białych znaków do dzielenia różnych składników instrukcji w celu uzyskania lepszej przejrzystości. Można to zrobić za pomocą operatora przecinka (,).

Na przykład następujące dwie instrukcje są równoważne, a wynikiem obu instrukcji będzie 15.

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

Chociaż Clojure ignoruje przecinki, czasami używa ich, aby ułatwić programiście czytanie.

Na przykład, jeśli masz mapę haszującą podobną do poniższej (def a-map {: a 1: b 2: c 3}) i poprosisz o jej wartość w oknie REPL, Clojure wydrukuje wynik jako {: a 1, : b 2,: c 3}.

Wyniki są łatwiejsze do odczytania, zwłaszcza jeśli patrzysz na dużą ilość danych.

Symbolika

W Clojure symbole są odpowiednikami identyfikatorów w innych językach programowania. Ale w przeciwieństwie do innych języków programowania, kompilator widzi symbole jako rzeczywiste wartości łańcuchowe. Ponieważ symbol jest wartością, symbol może być przechowywany w kolekcji, przekazywany jako argument do funkcji itp., Tak jak każdy inny obiekt.

Symbol może zawierać tylko znaki alfanumeryczne i „* +! /. : - _? ' ale nie może zaczynać się cyfrą ani dwukropkiem.

Poniżej znajdują się ważne przykłady symboli.

tutorial-point!
TUTORIAL
+tutorial+

Struktura projektu Clojure

Na koniec porozmawiajmy o typowej strukturze projektu dla projektu Clojure. Ponieważ kod Clojure działa na wirtualnej maszynie Java, większość struktury projektu w Clojure jest podobna do tej, którą można znaleźć w projekcie Java. Poniżej znajduje się migawka przykładowej struktury projektu w Eclipse dla projektu Clojure.

Należy zwrócić uwagę na następujące kluczowe rzeczy dotyczące powyższej struktury programu.

  • demo_1 - jest to pakiet, w którym umieszczony jest plik kodu Clojure.

  • core.clj - jest to główny plik kodu Clojure, który będzie zawierał kod aplikacji Clojure.

  • Folder Leiningen zawiera pliki, takie jak clojure-1.6.0.jar, które są wymagane do uruchomienia dowolnej aplikacji opartej na Clojure.

  • Plik pom.properties będzie zawierał informacje, takie jak groupId, artifactId i wersja projektu Clojure.

  • Plik project.clj zawiera informacje o samej aplikacji Clojure. Poniżej znajduje się przykład zawartości pliku projektu.

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