Clojure - базовый синтаксис
Чтобы понять основной синтаксис Clojure, давайте сначала посмотрим на простую программу Hello World.
Hello World как полная программа
Напишите «Hello world» в полной программе Clojure. Ниже приводится пример.
пример
(ns clojure.examples.hello
(:gen-class))
(defn hello-world []
(println "Hello World"))
(hello-world)
В отношении вышеуказанной программы необходимо отметить следующее.
Программа будет записана в файл с именем main.clj. Расширение clj - это имя расширения файла кода Clojure. В приведенном выше примере имя файла называется main.clj.
Ключевое слово defn используется для определения функции. Мы рассмотрим функции более подробно в другой главе. Но пока знайте, что мы создаем функцию под названием helloworld, в которой будет наш основной код Clojure.
В нашем коде Clojure мы используем оператор println для вывода сообщения «Hello World» на консоль.
Затем мы вызываем функцию hello-world, которая, в свою очередь, запускает оператор println.
Вышеупомянутая программа производит следующий вывод.
Выход
Hello World
Общая форма заявления
Общая форма любого оператора должна быть заключена в фигурные скобки, как показано в следующем примере.
(+ 1 2)
В приведенном выше примере все выражение заключено в фигурные скобки. Результатом вышеупомянутого оператора является 3. Оператор + действует как функция в Clojure, которая используется для сложения чисел. Значения 1 и 2 известны как parameters to the function.
Рассмотрим другой пример. В этом примере 'str' - это оператор, который используется для объединения двух строк. Строки «Hello» и «World» используются в качестве параметров.
(str "Hello" "World")
пример
Если мы объединим два приведенных выше оператора и напишем программу, она будет выглядеть следующим образом.
(ns clojure.examples.hello
(:gen-class))
(defn Example []
(println (str "Hello World"))
(println (+ 1 2)))
(Example)
Выход
Вышеупомянутая программа производит следующий вывод.
Hello World
3
Пространства имён
Пространство имен используется для определения логической границы между модулями, определенными в Clojure.
Текущее пространство имен
Это определяет текущее пространство имен, в котором находится текущий код Clojure.
Синтаксис
*ns*
пример
В командном окне REPL выполните следующую команду.
*ns*
Выход
Когда мы запускаем указанную выше команду, вывод будет отложен в зависимости от текущего пространства имен. Ниже приведен пример вывода. Пространство имен кода Clojure -
clojure.examples.hello
(ns clojure.examples.hello
(:gen-class))
(defn Example []
(println (str "Hello World"))
(println (+ 1 2)))
(Example)
Требовать заявление в Clojure
Код Clojure упакован в библиотеки. Каждая библиотека Clojure принадлежит пространству имен, которое аналогично пакету Java. Вы можете загрузить библиотеку Clojure с помощью оператора Require.
Синтаксис
(require quoted-namespace-symbol)
пример
Ниже приведен пример использования этого оператора.
(ns clojure.examples.hello
(:gen-class))
(require ‘clojure.java.io’)
(defn Example []
(.exists (file "Example.txt")))
(Example)
В приведенном выше коде мы используем ключевое слово require для импорта пространства имен clojure.java.io, которое имеет все функции, необходимые для функциональности ввода / вывода. Поскольку у нас нет необходимой библиотеки, мы можем использовать функцию «файл» в приведенном выше коде.
Комментарии в Clojure
Комментарии используются для документирования вашего кода. Однострочные комментарии обозначаются символом ;; в любой позиции в строке. Ниже приводится пример.
пример
(ns clojure.examples.hello
(:gen-class))
;; This program displays Hello World
(defn Example []
(println "Hello World"))
(Example)
Разделители
В Clojure операторы могут быть разделены или разделены с помощью изогнутых или квадратных скобок.
пример
Ниже приведены два примера.
(ns clojure.examples.hello
(:gen-class))
;; This program displays Hello World
(defn Example []
(println (+ 1 2 3)))
(Example)
Выход
Вышеупомянутая программа производит следующий вывод.
6
пример
Вот еще один пример.
(ns clojure.examples.hello
(:gen-class))
;; This program displays Hello World
(defn Example []
(println [+ 1 2 3]))
(Example)
Выход
Вышеупомянутая программа производит следующий вывод.
[#object[clojure.core$_PLUS_ 0x10f163b "clojure.core$_PLUS_@10f163b"] 1 2 3]
Пробелы
В Clojure можно использовать пробелы для разделения различных компонентов оператора для большей ясности. Это можно сделать с помощью оператора запятой (,).
Например, следующие два оператора эквивалентны, и результат обоих операторов будет 15.
(+ 1 2 3 4 5)
(+ 1, 2, 3, 4, 5)
Хотя Clojure игнорирует запятые, он иногда использует их, чтобы программисту было легче читать.
Например, если у вас есть хэш-карта, подобная следующей (def a-map {: a 1: b 2: c 3}), и вы запрашиваете ее значение в окне REPL, Clojure распечатает результат как {: a 1, : b 2,: c 3}.
Результаты легче читать, особенно если вы просматриваете большой объем данных.
Символы
В Clojure символы эквивалентны идентификаторам в других языках программирования. Но в отличие от других языков программирования, компилятор видит символы как фактические строковые значения. Поскольку символ является значением, он может храниться в коллекции, передаваться в качестве аргумента функции и т. Д., Как и любой другой объект.
Символ может содержать только буквенно-цифровые символы и '* +! /. : - _? ' но не должен начинаться с цифры или двоеточия.
Ниже приведены действительные примеры символов.
tutorial-point!
TUTORIAL
+tutorial+
Структура проекта Clojure
Наконец, давайте поговорим о типичной структуре проекта Clojure. Поскольку код Clojure выполняется на виртуальной машине Java, большая часть структуры проекта в Clojure аналогична той, что вы найдете в проекте Java. Ниже приведен снимок типовой структуры проекта в Eclipse для проекта Clojure.
О приведенной выше структуре программы необходимо отметить следующие ключевые моменты.
demo_1 - это пакет, в который помещается файл кода Clojure.
core.clj - это основной файл кода Clojure, который будет содержать код для приложения Clojure.
Папка Leiningen содержит такие файлы, как clojure-1.6.0.jar, которые необходимы для запуска любого приложения на основе Clojure.
Файл pom.properties будет содержать такую информацию, как groupId, artifactId и версию проекта Clojure.
Файл project.clj содержит информацию о самом приложении Clojure. Ниже приведен образец содержимого файла проекта.
(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"]])