関数型言語Clojureに入門した！環境構築からHelloWorldまで

#はじめに
インターン生として、Clojureという言語でWeb開発を勉強させていただくことになりました。

私には関数型言語を利用したこと、あるいは関数型でプログラムを組んだ経験なんてないですし、
何ならWeb開発も、正直初心者です。

Clojureってよくわからん、やたらとカッコ多い言語だよね！？
あと横にずらずら書いていく感じの、SQLに近い何かを感じるやつ！？

現時点ではこの程度の知識・認識しか持ち合わせておりません。
（この認識が合っているのかさえも不明）

そんな状態ですが、
「関数型言語なるものを触ってみたい！」という思いや、
「数学が好きなら関数型言語向いてるんじゃないの」という声に後押しされ、

**Clojure、はじめます。**

# この記事でわかること

- Linuxにおける、Clojure実行環境の導入方法
  - OpenJDKの導入方法
  - Leiningenの導入方法
- REPLを使ったHello world

# 実行環境

- 事前の環境
  - Ubuntu 20.04
- 当記事内で導入する環境
  - OpenJDK 14.0.2
  - Homebrew 2.5.11
  - Leiningen 2.9.4 on Java 14.0.2

# Clojureってなに

> Clojure (発音は/'klouʒər/[2], クロージャー)はプログラミング言語であり、LISP系の言語の方言の一つである。関数型プログラミングのプログラミングスタイルでのインタラクティブな開発を支援し、マルチスレッドプログラムの開発を容易化する汎用言語である。Clojure言語のプログラムはJava仮想マシンとMicrosoft .NET 共通言語ランタイムで動作する。Clojure言語は「データとしてのプログラムコード」 (英語:「code as data」) という思想で設計されており、洗練されたマクロ機構を持つ。 
[Clojure - Wikipedia(2020.11.27)](https://ja.wikipedia.org/wiki/Clojure)

# 環境構築

とりあえず書いて実行するだけ、つまりHello Worldするだけなら、
[Repl.it](https://repl.it/)(オンラインの実行環境)があるのでそちらを使っても良いのですが、
今回、ローカル環境を構築することが目的に含まれているので、今回これは無視していきます。

Web開発には以下3つの環境が必要とのことなので、これらの達成を目的にそれぞれインストールしていきます。


- Java 7 以上
- Leiningen 2.5.2 以上
- お好きなエディタ or IDE(これは本記事では割愛)

参考：[Clojure で Web 開発をはじめてみよう » Part1: 準備編](https://ayato-p.github.io/clojure-beginner/intro_web_development/part1_prepare.html)

## Java(OpenJDK)の導入

バージョンは7以上が要求されるとのことでしたが、私は14を導入します。

> Leiningen and Clojure require Java. OpenJDK version 8 is recommended at this time.
[Leiningen](https://leiningen.org/)

ただし今のところ、上記のようにOpenJDKは8のほうがいいよとLeiningen公式サイトがおっしゃっているので、
バージョンは8が一番よいのかもしれません。

```bash
$ apt install openjdk-14-jdk-headless
```

Javaが正しくインストールされているかを確認します。

```bash
$ java --version
openjdk 14.0.2 2020-07-14
OpenJDK Runtime Environment (build 14.0.2+12-Ubuntu-120.04)
OpenJDK 64-Bit Server VM (build 14.0.2+12-Ubuntu-120.04, mixed mode, sharing)
```

## Leiningenの導入

Leiningenを導入する上で、brewというものを導入すると便利なようです。

Leiningenとは：Node.jsにおけるnpmのようなClojureパッケージ管理ツール
brewとは：MacOSとLinuxにおけるパッケージ管理ツール

### HomeBrewの導入



[LinuxbrewでUbuntu18.04のパッケージ管理](https://qiita.com/tikogr/items/e19c2a2cec41a8d4d85f) を参照しながら進めていきます。

```bash
$ sudo apt-get install build-essential curl file git

$ sh -c "$(curl -fsSL https://raw.githubusercontent.com/Linuxbrew/install/master/install.sh)"

```

`~/.bashrc`に下記内容を書き加え、パスを通します。

```
export PATH='/home/linuxbrew/.linuxbrew/bin:/home/linuxbrew/.linuxbrew/sbin':"$PATH"
```

Homebrewのインストールが正しく行われたかを確認します。

```
$ brew --version

Homebrew 2.5.11
Homebrew/linuxbrew-core (git revision 7c4cea; last commit 2020-11-27)
```

### Leiningenの導入
上述のHomebrewを用いて、Leiningenを導入します。

```
$ brew install leiningen
```

Leiningenが正しくインストールされたかを確認するため、下記コマンドを実行します。


```
$ lein --version
OpenJDK 64-Bit Server VM warning: Options -Xverify:none and -noverify were deprecated in JDK 13 and will likely be removed in a future release.
Leiningen 2.9.4 on Java 14.0.2 OpenJDK 64-Bit Server VM
```

# HelloWorldする

`$ lein repl`によってREPLを立ち上げます。
REPLというのはPythonにおける対話モードや、JavaScriptのコンソール（Webブラウザ上でF12押すと立ち上がるアレ）と同等のものととらえてよさそうです。

コマンド実行後、下記内容が記述されきるまでに（初回は特に）時間がかかったのが印象的でした。

```
$ lein repl

OpenJDK 64-Bit Server VM warning: Options -Xverify:none and -noverify were deprecated in JDK 13 and will likely be removed in a future release.
nREPL server started on port 46097 on host 127.0.0.1 - nrepl://127.0.0.1:46097
REPL-y 0.4.4, nREPL 0.7.0
Clojure 1.10.1
OpenJDK 64-Bit Server VM 14.0.2+12-Ubuntu-120.04
    Docs: (doc function-name-here)
          (find-doc "part-of-name-here")
  Source: (source function-name-here)
 Javadoc: (javadoc java-object-or-class-here)
    Exit: Control+D or (exit) or (quit)
 Results: Stored in vars *1, *2, *3, an exception in *e

user=> 

```

`user=>`と記述されていればREPLが立ち上がっています。

ClojureにおけるHello Worldは、
`(prntln "hello world")`です。

入力して実行してみます。

```clojure
user=> (println "hello world")
hello world
nil
```

Hello Worldできました！


# 参考

- [https://www.sejuku.net/blog/85358](https://www.sejuku.net/blog/85358)
- [Clojure の日本語ガイド](https://ayato-p.github.io/clojure-beginner/index.html)
- [ClojureでREPL駆動開発を始めよう](https://qiita.com/lagenorhynque/items/d68934546fa7283bad9d)
- [clojureでHello World](https://qiita.com/mktoho-n/items/fc07a70b64090462c0fa)
- [LinuxbrewでUbuntu18.04のパッケージ管理](https://qiita.com/tikogr/items/e19c2a2cec41a8d4d85f)
- [Leiningen](https://leiningen.org/)