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