基本構文
3つの基本についてまとめています
- リテラル
- 関数の定義と呼び出し
- 特殊フォーム
今日は 3. 特殊フォーム のなかのdef
についてまとめます
2. 特殊フォーム
特殊フォーム(Special forms)は、Clojureコンパイラによって直接解釈されます
def
def
はシンボルの名前を持ち、現在の名前空間(ns)を名前空間とする、グローバルなvarを作成、登録します
var
は値を参照するためのオブジェクトで、変数のようなものです。
変更可能性や、スレッドセーフ性といった性質があります
:private
や、:doc
などのシンボルをメタデータとして付与し、特定の挙動を持たせることができます
:private
アクセス制御を表し、キーが存在しない場合はpublicになります
(def ^:private secret-value "password")
:doc
varの内容に関するドキュメントを含む文字列(1~3行)
(def ^{:doc "この値は今日の夕飯を表します"} dinner "カツ丼")
:test
assert
を使用してテストを実行する
(def ^{:test (fn [] (assert (= "とんかつ" lunch)))} lunch "とんかつ")
ここでは lunch
の値が とんかつ
であることを確認しています
:tag
定義されたシンボルが返す値の型情報を指定することができる
(def ^{:tag String} greeting "Hello, world!")
*:file
シンボルがどのファイルで定義されているか設定します
(指定することはない)
clj꞉todo.core꞉> (meta #'breakfast)
{:tag java.lang.String,
:line 32,
:column 1,
:file "/.../clojure-todo/src/todo/core.clj",
:name breakfast,
:ns #namespace[todo.core]}
:line
シンボルが定義された行番号
(指定することはない)
clj꞉todo.core꞉> (meta #'breakfast)
{:tag java.lang.String,
:line 32,
:column 1,
:file "/.../clojure-todo/src/todo/core.clj",
:name breakfast,
:ns #namespace[todo.core]}
:name
定義されたシンボルの名前
clj꞉todo.core꞉> (meta #'breakfast)
{:tag java.lang.String,
:line 32,
:column 1,
:file "/.../clojure-todo/src/todo/core.clj",
:name breakfast,
:ns #namespace[todo.core]}
:ns
シンボルが属している名前空間
clj꞉todo.core꞉> (meta #'breakfast)
{:tag java.lang.String,
:line 32,
:column 1,
:file "/.../clojure-todo/src/todo/core.clj",
:name breakfast,
:ns #namespace[todo.core]}
:macro
このシンボルがマクロであるときにtrueが入る
clj꞉todo.core꞉> (meta #'macro-func)
{:arglists ([x]),
:line 38,
:column 1,
:file "/.../clojure-todo/src/todo/core.clj",
:name macro,
:ns #namespace[todo.core],
:macro true}
:arglists
関数やマクロの引数リストを記録している
clj꞉todo.core꞉> (defn greeting [x] (println (str "Hello, " x)))
clj꞉todo.core꞉> (meta #'greeting)
{:arglists ([x]),
:line 40,
:column 1,
:file "/Users/ooka/dev/study/clojure-todo/src/todo/core.clj",
:name greeting,
:ns #namespace[todo.core]}
明日は他の特殊フォームをまとめようと思います