ゼロから始めるScala (環境構築 mac)

# Scala をはじめよう

## Scala とは?

プログラミング言語の1つ。

「オブジェクト指向」と「関数型プログラミング」の両方の性質を併せ持つ、というか、実現できるというか、両方できる二刀流。

`Scala` は `scalable language (拡張可能な/拡張可能性の高い 言語)` に由来する。



## Scala の「良さ」
* オブジェクト指向と関数型プログラミングの両方を表現できる。
* オブジェクトの「不変性」が意識された設計
* 高いモジュール性
* Java と互換性がある (Java のライブラリを使うことができる)
* 非同期の計算ができる `Future` ライブラリを標準装備
* 並列・分散プログラミングのためのライブラリ `Akka` がある


## インストール on Mac

`Homebrew` を使うのが簡単だと思う。

環境構築は全部こいつでなんとかなる(気がする)。

### 探す

```console
# scala (本体, しかし前提として Java が動く環境が必要 - 後述)
$ brew search scala
==> Formulae
scala        scala@2.11   scala@2.12   scalaenv     scalapack    scalariform  scalastyle
==> Casks
scala-ide

# sbt (scalaのビルドツール, 色々するのに便利なやつと思えば良い)
$ brew search sbt
==> Formulae
sbt                           sbt@0.13                      sbtenv
```

### (前提として) Java をインストール

やはり`Homebrew` を使う。

`AdoptedOpenJDK` をインストールするのが良いっぽい。

<font color='gray'>AdoptedOpenJDKはJava大好きコミュニティ()により提供されているOpenJDKのバイナリ(だと思っている)。
Oracle経由でのインストールが、アカウント登録とか、自分でフォルダ配置するとか面倒になったので、変にこだわるよりは、これでサクッと入れてしまうのがコスト低いと思う...</font>

```console
# リポジトリの追加
$ brew tap AdoptOpenJDK/openjdk

# search
$ brew search openjdk

# install
$ brew cask install adoptopenjdk11
```

#### JAVA_HOMEのPATHを設定しよう

`java_home` コマンドでインストールされたディレクトリの場所を確認

```console
$ /usr/libexec/java_home -v 11
/Library/Java/JavaVirtualMachines/adoptopenjdk-11.jdk/Contents/Home
```

`$ なんたら/java_home -v 11`して出てきた文字列を、環境変数`JAVA_HOME`として`PATH`に追加

必要に応じて `.bash_profile` や `.bashrc` などに記述する。

```bash
# .bashrc に書いた。
export JAVA_HOME=/Library/Java/JavaVirtualMachines/adoptopenjdk-11.jdk/Contents/Home
PATH=${JAVA_HOME}/bin:${PATH}
```

設定ファイルの再読み込み

```console
# 以下、どちらか一方でOK
source ~/.bashrc
exec $SHELL -l
```

一応、チェックする。

```
$ java -version
openjdk version "11.0.7" 2020-04-14
OpenJDK Runtime Environment AdoptOpenJDK (build 11.0.7+10)
OpenJDK 64-Bit Server VM AdoptOpenJDK (build 11.0.7+10, mixed mode)

$ javac -version
javac 11.0.7

# コンパイル例
$ javac source.java

# 実行例 (.class を含めないように注意)
$ java Source
```

### scala を入れる

(後述の)`sbt`だけでも良いが、一応書いておく。

```
# install
$ brew install scala
```

以上。

#### 使ってみる

```
# REPL起動
$ scala

Welcome to Scala 2.13.3 (OpenJDK 64-Bit Server VM, Java 11.0.7).
Type in expressions for evaluation. Or try :help.
scala>
```

##### 例

```
// 出力
scala> println("Hello scalalala")
Hello scalalala

// 演算1
scala> 1 + 2
val res1: Int = 3

// 演算2
scala> 3 * 6
val res2: Int = 18

// 演算3
scala> 8.0 / 2.0
val res3: Double = 4.0

// 終了
scala> :quit
// scala> :q でも OK
```

##### ソースファイル

拡張子は`.scala`

```Main.scala
object Main {
  def main(args: Array[String]): Unit = {
	println("Hello scala program")
  }
}
```

* コンパイルして実行

```
$ scalac Main.scala
$ scala Main
```

* コンパイルしないで実行

```
$ scala Main.scala
```

* REPLから実行

```
$ scala

Welcome to Scala 2.13.3 (OpenJDK 64-Bit Server VM, Java 11.0.7).
Type in expressions for evaluation. Or try :help.
scala> :load Main.scala
```

### sbt を入れる

```
# install
$ brew install sbt
```

以上。


#### 使ってみる

```
# REPL起動
$ sbt console
...
[info] Starting scala interpreter...
Welcome to Scala 2.12.10 (OpenJDK 64-Bit Server VM, Java 11.0.7).
Type in expressions for evaluation. Or try :help.

scala>
```

(あとは同じなので詳細略)

##### sbt でコンパイル, 実行

下準備として、何かフォルダを作っておくと良いと思います。
(名前はmyfolderとしましたが、なんでも良いです、対応する部分は読み替えてください)

```
$ mkdir myfolder
$ cd myfolder
```

myfolder下にソースファイルを書いて置きます。

```HelloWorld.scala
object HelloWorld {
  def main(args: Array[String]): Unit = {
    println("Hello, Scala World!")
  }
}
```

myfolder下に`sbt`の設定ファイルを置きます

```build.sbt
scalaVersion := "2.12.10"

scalacOptions ++= Seq("-deprecation", "-feature", "-unchecked", "-Xlint")
```

`sbt`を起動

```
[info] ...
sbt:myfolder>
```

`run`コマンドで実行

```
sbt:myfolder> run
[info] Compiling 1 Scala source to ...
[info] Running HelloWorld
Hello, Scala World!
[success] Total time: 1 s, completed 2015/02/09 15:44:44`
```

`run`コマンドでは、mainメソッドを持つオブジェクトを探して実行してくれるらしい。

<font color='gray'>というか、なんか日付がおかしい...??</font>

## 参考

* [MacとWindowsを両方書いてあってわかりやすい (+ IntelliJ, Play FrameWork まで扱っている)](https://qiita.com/yuichi0301/items/4785e3fe490736d4ee50)
* [ドワンゴ 新卒エンジニア向けの研修資料](https://scala-text.github.io/scala_text/sbt-compile-execute.html)
* [Scalaプログラムの基本（まとめ）](http://www2.nagano.ac.jp/hiraoka/BP/14_4.html)
* [第一章：猿でも分かるScala!](https://qiita.com/natsuisexy/items/59c2190561e08b85d1de)  
<font color='gray'>どうして猿を引き合いに出したがるのか...<font>