【初学者向け】Clojure を始めよう

## 始めに

[Clojure Advent Calendar 2023](https://qiita.com/advent-calendar/2023/clojure) の15日目の記事となります。
初めまして。株式会社テンクーでエンジニアをしております、 @akinos と申します。
Clojure を触り始めて1年半程たち、学習する上で参照した資料などを本記事で紹介します。

### 対象

本記事のメインターゲットは Clojure を使い始めたばかりの方、プログラミングの経験が浅い方です。

### 内容

本記事はコードの書き方の説明ではなく、 Clojure で開発を行う上で参照するソースを中心にまとめています。

## エディター/IDE(統合開発環境)

- まずは使い慣れているエディターを使用して開発を始めましょう。
- Clojure での開発は Emacs, IntelliJ IDEA, VSCode, Vim あたりがよく使われているので、これらを使うと困った時に情報が多く見つかるのでおすすめです。

### Emacs/CIDER

- [CIDER](https://cider.mx/)
- [CIDER(GitHub)](https://github.com/clojure-emacs/cider)

### IntelliJ IDEA/Cursive

- [Cursive](https://cursive-ide.com)

### VSCode/Calva

- [Calva](https://calva.io/)
- [Calva(GitHub)](https://github.com/BetterThanTomorrow/calva)

### Vim/vim-iced

- [vim-iced(GitHub)](https://github.com/liquidz/vim-iced)

## 開発関連

### Leiningen

- [Leiningen](https://leiningen.org/)
- `Leiningen`は Clojure のプロジェクト管理ツールで、ライニンゲンと読みます。
- `project.clj`というファイルでプロジェクトの構成の管理を行います。
- `lein` コマンドによりテストやビルド、デプロイなどを行うことができます。

### Babashka

- [Babashka(GitHub)](https://github.com/babashka/babashka)
- [Babashka book](https://book.babashka.org/)
- Clojure のランタイムの一つで、コードを高速に実行することができ、シェルスクリプトの代替として使うことができます。
- 使える機能に制限がある点がデメリットになりますが、シェルスクリプトよりも小回りは効くので非常に有用です。

### 動作確認/デバッグ

- IDE にデバッグの機能が備わっているので、 IDE を使用したデバッグに関しては各ドキュメントを参照してください。
- 既に実装されている関数の場合、テストコードがあればそれを確認しましょう。どういうデータ構造の input が求められていて、どういう output を得られるかの大枠が掴めます。
- 処理の途中のデータ構造などを知りたい場合は `println`, `logging`, `spit` などを使用すると便利です。
- データサイズが大きいときは構造の理解が難しいこともあるので、リストであれば最初の1つのデータを見たり、マップであれば `keys` でどういう key が含まれているかの確認するのがおすすめです。

#### [println](https://clojuredocs.org/clojure.core/println)

- `println` は引数に渡したものを標準出力に出す関数です。
- データが小さい場合などには有効ですが、大きい場合は文字で画面が埋め尽くされて見づらくなることもあります。
- データサイズが大きい場合は最初の1つだけ出すなど調整すると見やすくなります。

#### [logging](https://github.com/clojure/tools.logging)

- log を出力する際に使うマクロです。
- log ファイルに書き出すこともできるため、あとで確認したい場合などにも便利です。
- 既に logging がたくさん使われている場合はその中から探すのが面倒になる可能性はあります。

#### [spit](https://clojuredocs.org/clojure.core/spit)

- spit はファイルに書き込む時に使用される関数です。
- 大きいデータを書き出したり、あとで何度も見返したい場合などに有用です。
- 以下のようなコードを使用すると整形されたデータが書き出されます。以下の例は `sample.yml` というファイルに任意の `data` を書き出す処理です。

```clj
(spit "sample.yml" (with-out-str (clojure.pprint/pprint data)))
```
## 学習

- 勉強や業務を行う上で参考になりそうな資料をまとめました。

### ドキュメント

- [Clojure](https://clojure.org/index): Clojure の公式サイトです。Clojure の概要や最新のリリースに関する情報などを入手できます。
- [Clojure Core and Contrib API Overview](https://clojure.github.io/): 公式に管理されており、 clojure core や様々なライブラリのドキュメントが掲載されています。
- [ClojureDocs](https://clojuredocs.org/): コミュニティにより管理されているドキュメントです。各関数の使用例などが掲載されており、関数の使い方を理解するのにおすすめです。
- [The Clojure Style Guide](https://guide.clojure.style/): Bozhidar Batsov 氏により作成された Clojure のスタイルガイドです(英語)。
- [Clojureスタイルガイド](https://totakke.github.io/clojure-style-guide/): 上記のスタイルガイドを日本語訳したものです。
- [Clojure Cheat Sheet](https://clojure.org/api/cheatsheet): Clojure のチートシートです。

### 学習サイト

- [4ever-clojure](https://4clojure.oxal.org): 4Clojure の Web サイトが閉鎖され、その代わりに現在こちらが使われているようです。

### 書籍

- [プログラミングClojure 第2版](https://www.ohmsha.co.jp/book/9784274069130/): 2013年発売の書籍ですが日本語で書かれており、 Clojure の勉強を始めるのにはおすすめです。
- [Clojure for the Brave and True](https://www.braveclojure.com/): 2015年発売で英語の書籍ですが、 Online 版は無料で見られます。

### その他

- [Clojure Cookbook(GitHub)](https://github.com/clojure-cookbook/clojure-cookbook): O'Reilly が出版している`Clojure Cookbook`の GitHub のページです。書籍を購入しなくてもライブラリの使い方とかざっとわかるので個人的におすすめです。
- [The Clojure Toolbox](https://www.clojure-toolbox.com/): Clojure のライブラリーなどをカテゴリーごとに分類しています。
- [Awesome Clojure(GitHub)](https://github.com/razum2um/awesome-clojure): こちらもカテゴリごとにライブラリがまとまっています。
- [Clojure Language Update 2023(Qiita)](https://qiita.com/athos/items/fcc35ea863e7f51657d5): 毎年アドベントカレンダーで Clojure 界隈の動向をまとめてくれているため、今年どんなことが起こったかを確認するのにおすすめです。

## プログラミング初心者の方に向けて

- 最初はわからないことがたくさんあり、焦ることもたくさんあると思いますが、まずは着実に進めていくことが大切だと思います。
- 「動いたから大丈夫」となんとなくで実装するのではなく関数の動きなどをしっかりと理解しながら実装しましょう。関数を理解することでバグの発生を防ぐことにも繋がります。
- 他者のコードから学べることはたくさんあります。どうしてこういう実装をしているのかと考えることや、こういう風に書くと綺麗なコードだなと考えるのも大切なことです。他の人の書いたコードを見る時間も作りましょう。
- 業務で修正指示などがあった場合はただその通りに修正するのではなく、どうしてそういう修正指示がされたのかということを考えたり質問することで同じミスを繰り返さないことに繋がります。

## 最後に

- この他に参考になるソースなどあれば共有いただけると大変ありがたいです。
- 上記の資料が少しても学習/業務を行う上で参考になれば幸いです。
- 読んでいただき、ありがとうございました！