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