Clojure-basic-syntax

提供:Dev Guides
移動先:案内検索

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