0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【ひとりカレンダー】ClojureAdvent Calendar 2024

Day 6

Clojureの基本構文 - 特殊フォームその1

Last updated at Posted at 2024-12-05

advent_calendar_2024.png

Advent Calendar 2024 Day 5

基本構文

3つの基本についてまとめています

  1. リテラル
  2. 関数の定義と呼び出し
  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]}

明日は他の特殊フォームをまとめようと思います

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?