Clojureとは

![advent_calendar_2024.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2985550/f4cd8ce0-6352-a1d8-4cae-f39dd44f4def.png)

[*Advent Calendar 2024 Day 1*](https://qiita.com/advent-calendar/2024/clojure)

今日から **QIita アドベントカレンダー2024** を走らせていただきます
`Clojure` に関するあれこれで1ヶ月間やり切りたいと思うのでよろしくお願いします

## なぜClojureなのか

これまでもClojureの書き心地が好きで、
たまに遊んだりしていました。

しかし、ちゃんと腰を据えて勉強をしたことがなく、
基本的なことも全然わからないなと思い、
集中して勉強をする期間を設けいと思いました。

Clojureのような表現力が高く、ハイスペック言語を学ぶことは、
他の言語を書いている時でも役に立つと思っています。
(問題に対しての手札が増えるイメージ)

また、他の関数型言語を仕事で書いたことがありますが、
「関数型の良さを引き出せているのだろうか？」
と考えることが多く、そのあたりに関しても意識しながらアウトプットしていきたいと思っています。

さて、動機はこんなところにして、本題のClojureの話をしていきます
今日は公式ドキュメントを読みながらまとめようと思います。

## Clojureとは

公式で書かれているものを訳してみます

> **Clojure is a robust, practical, and fast programming language with a set of useful features that together form a simple, coherent, and powerful tool.**
> 
> Clojure is a dynamic, general-purpose programming language, combining the approachability and interactive development of a scripting language with an efficient and robust infrastructure for multithreaded programming. Clojure is a compiled language, yet remains completely dynamic – every feature supported by Clojure is supported at runtime. Clojure provides easy access to the Java frameworks, with optional type hints and type inference, to ensure that calls to Java can avoid reflection.
> 
> Clojure is a dialect of Lisp, and shares with Lisp the code-as-data philosophy and a powerful macro system. Clojure is predominantly a functional programming language, and features a rich set of immutable, persistent data structures. When mutable state is needed, Clojure offers a software transactional memory system and reactive Agent system that ensure clean, correct, multithreaded designs.
> 
> I hope you find Clojure's combination of facilities elegant, powerful, practical and fun to use.
> 
> Rich Hickey
> author of Clojure

**Clojureは、堅牢で実用的かつ高速なプログラミング言語であり、一連の便利な機能を備えており、それらが組み合わさることでシンプルで一貫性のある強力なツールを形成しています。**

Clojureは、スクリプト言語の取り組みやすさと対話的な開発環境を備えつつ、マルチスレッドプログラミングに適した効率的で堅牢なインフラを提供する、動的で汎用的なプログラミング言語です。

Clojureはコンパイルされる言語ですが、完全に動的で、Clojureがサポートするすべての機能は実行時に使用できます。また、Javaフレームワークに簡単にアクセスできるため、オプションの型ヒントと型推論により、Javaへの呼び出しでリフレクションを避けることが可能です。

ClojureはLispの方言であり、Lispと同様に「コードをデータとして扱う」哲学と強力なマクロシステムを持っています。

Clojureは主に関数型プログラミング言語であり、不変で永続的なデータ構造が豊富に揃っています。可変状態が必要な場合には、Clojureはソフトウェアトランザクショナルメモリシステムとリアクティブなエージェントシステムを提供しており、クリーンで正確なマルチスレッド設計を可能にします。

Clojureの持つ機能の組み合わせがエレガントで強力、実用的で楽しいと感じていただければ幸いです。

Rich Hickey

https://clojure.org/

## 特徴

### 関数型プログラミング

- イミュータブルデータ構造:
    - データは基本的に不変（immutable）であり、変更が必要な場合は新しいコピーが作成される
- ファーストクラス関数:
    - 関数が第一級市民であり、引数や戻り値として扱える
- 高階関数:
    - 関数を引数に取ったり、関数を返したりする関数をサポート
- 遅延評価:
    - コレクションは必要になるまで評価されない（lazy-seq）

### 強力なマクロシステム

- Clojureのコードはデータ構造（S式）として記述されるため、コードを簡単に生成、変形可能
    - これにより高度なDSLや再利用可能な構文を構築可能

(コードを生成するプログラムくらいに認識しています)

### データ指向プログラミング

- 組み込みのリッチなデータ構造（リスト、ベクター、マップ、セット）

### 並行処理のサポート

- ソフトウェアトランザクショナルメモリ（STM）:
    - 競合状態を避けるためのトランザクショナルな状態管理
- エージェントとアトム:
    - マルチスレッド環境で状態を管理
- コア非同期ライブラリ（core.async）:
    - チャネルとゴルーチンのような機能で非同期処理をシンプルにする

### Javaとの相互運用性

- JVM上で動作するため、Javaの豊富なライブラリやエコシステムをそのまま活用可能
    - Javaオブジェクトやクラスの呼び出しが簡単（例: (java.util.Date.)）

## 最後に

これだけみると、とても**強そう**です。

特にマクロあたりはなんとなく知ってるけど、実際に使ったことがなく、
今日から始まる **QIita アドベントカレンダー2024** を通して、特徴について知識だけでなく、実感していけることを目標にアウトプットしていきますので、よろしくお願いします。