Clojure-basic-syntax
Clojure-基本的な構文
Clojureの基本的な構文を理解するために、まず簡単なHello Worldプログラムを見てみましょう。
完全なプログラムとしてのHello World
完全なClojureプログラムで「Hello world」を作成します。 以下はその一例です。
例
(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です。 + operatorは、数字の追加に使用されるClojureの関数のように機能します。 1および2の値は、*関数のパラメーター*として知られています。
別の例を考えてみましょう。 この例では、「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をインポートしています。 必要なライブラリがないため、上記のコードで「ファイル」関数を使用できます。
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、:c 3}。
特に大量のデータを表示している場合は、結果が読みやすくなります。
シンボル
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-v10l"
}
:dependencies [[org.clojure/clojure "1.6.0"]])