Clojure-基本構文

Clojureの基本的な構文を理解するために、最初に簡単なHelloWorldプログラムを見てみましょう。

完全なプログラムとしてのHelloWorld

完全なClojureプログラムで「Helloworld」を記述します。以下は例です。

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

上記のプログラムについては、以下の点に注意する必要があります。

  • プログラムはmain.cljというファイルに書き込まれます。拡張子「clj」は、clojureコードファイルの拡張子名です。上記の例では、ファイルの名前はmain.cljと呼ばれています。

  • 'defn'キーワードは、関数を定義するために使用されます。関数については、別の章で詳しく説明します。しかし今のところ、メインのClojureコードを持つhelloworldという関数を作成していることを知っておいてください。

  • Clojureコードでは、「println」ステートメントを使用して「HelloWorld」をコンソール出力に出力しています。

  • 次に、hello-world関数を呼び出します。この関数は「println」ステートメントを実行します。

上記のプログラムは次の出力を生成します。

出力

Hello World

声明の一般的な形式

次の例に示すように、ステートメントの一般的な形式は中括弧で評価する必要があります。

(+ 1 2)

上記の例では、式全体が中括弧で囲まれています。上記のステートメントの出力は3です。+演算子は、数字の加算に使用されるClojureの関数のように機能します。1と2の値は次のように知られています parameters to the function

別の例を考えてみましょう。この例では、「str」は2つの文字列を連結するために使用される演算子です。文字列「Hello」と「World」がパラメータとして使用されます。

(str "Hello" "World")

上記の2つのステートメントを組み合わせてプログラムを作成すると、次のようになります。

(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パッケージに類似した名前空間に属しています。'Require'ステートメントを使用してClojureライブラリをロードできます。

構文

(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をインポートしています。必要なライブラリがないため、上記のコードで「file」関数を使用できます。

Clojureのコメント

コメントは、コードを文書化するために使用されます。単一行コメントは、;;を使用して識別されます。行の任意の位置。以下は例です。

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

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

区切り文字

Clojureでは、曲線または角括弧の中括弧を使用して、ステートメントを分割または区切ることができます。

以下は2つの例です。

(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で空白を使用して、ステートメントのさまざまなコンポーネントを分割し、わかりやすくすることができます。これは、コンマ(、)演算子を使用して実行できます。

たとえば、次の2つのステートメントは同等であり、両方のステートメントの出力は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、:c3}。

特に大量のデータを表示している場合は、結果が読みやすくなります。

記号

Clojureでは、シンボルは他のプログラミング言語の識別子と同等です。ただし、他のプログラミング言語とは異なり、コンパイラはシンボルを実際の文字列値と見なします。シンボルは値であるため、他のオブジェクトと同様に、シンボルをコレクションに格納したり、関数などに引数として渡すことができます。

記号には、英数字と '* +!のみを含めることができます。/。:-_? ' ただし、数字やコロンで始めてはなりません。

以下は、シンボルの有効な例です。

tutorial-point!
TUTORIAL
+tutorial+

Clojureプロジェクトの構造

最後に、Clojureプロジェクトの典型的なプロジェクト構造について説明しましょう。ClojureコードはJava仮想マシン上で実行されるため、Clojure内のプロジェクト構造のほとんどはJavaプロジェクトで見られるものと似ています。以下は、Clojureプロジェクト用のEclipseのサンプルプロジェクト構造のスナップショットです。

上記のプログラム構造については、以下の重要事項に注意する必要があります。

  • demo_1-これはClojureコードファイルが配置されるパッケージです。

  • core.clj-これはメインのClojureコードファイルであり、Clojureアプリケーションのコードが含まれます。

  • Leiningenフォルダーには、Clojureベースのアプリケーションを実行するために必要なclojure-1.6.0.jarなどのファイルが含まれています。

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