Elixir実践ガイド
本書のテーマであるプログラミング言語Elixirに私が出会ったのがいつだったのか、はっきりとは覚えていません。 曖昧に2010年代の中頃と言っておきましょう。それまでの約10年間、私はもっぱらRuby on Rails(プログラミング言語RubyベースのWeb開発フレームワーク。通称「Rails」)を使ってきました。 RailsでWebアプリケーションを開発したり、Railsについて解説する書籍を書いたりしてきました。
なぜElixirに興味を抱いたのかもよくわかりません。 世の中に「関数型プログラミング言語」というものが存在して、とても興味深いものであるという噂は耳にしていました。 Elixir以外の関数型言語について少し調べたこともありました。 しかし、研究者や理論家に好まれるが実用的ではないという先入観も抱いていたので、なかなか本気で取り組む気にはなりませんでした。
その後、転機が私に訪れました。2010年代の後半、Webアプリケーション開発の世界でシングルページアプリケーション(SPA)が大流行しました。 SPAとはデスクトップアプリケーションのようなUI/UXを提供するWebアプリケーションの総称です。 SPA開発を支えるJavaScriptフレームワーク(React、Vue、等)の利用が急速に普及していきました。 私もこの大波に乗るべく、精力的に情報を収集し試行錯誤を繰り返しました。 その中で発見したのが、Phoenix Frameworkです。ElixirベースのWeb開発フレームワーク、通称「Phoenix」です。
調査を進めていくと次第に私は興奮してきました。Phoenixは当時私がSPA開発で直面していたさまざまな問題をエレガントに解決してくれそうでした。 また、Elixirが得意とする並行プログラミングを追求していけば、従来の枠を超える革新的なWebサービスが作れそうでした。 Phoenixが私たちの業界におけるゲームチェンジャーになるだろうという予感をいだきました。
実際にある程度の規模の具体的なWebアプリケーションを作ってみると、Elixirはとても書きやすく実用的なプログラミング言語であることがわかりました。 その構文はRuby風で親しみやすいものでした。すべてのデータが変更不可(immutable)であるという関数型プログラミング言語の制約は開発の支障になりませんでした。 さらに、オブジェクト指向プログラミング(OOP)で言うところの「継承(inheritance)」に当たる仕組みがElixirには存在しないのですが、驚くべきことに、それも不満の種にはならなかったのです。
ElixirはJava、PHP、Python、Ruby等と比べれば歴史が浅く、世間の認知度も低い言語です。 しかし、2020年代にElixirは黄金時代を迎えるだろうと私は予測しています。その根拠はElixirコミュニティの熱量です。 多くの才能ある人々や有力な企業群が参入したことにより、Elixirのエコシステムは急速に成熟しつつあります。
さて、本書はElixirの入門書です。新しい言語に挑戦しようとする現役のプログラマーだけでなく、プログラミング自体の初心者にも門戸を開くべく、 「変数」や「整数」のような基本的な概念についてもできるかぎり丁寧に説明していきます。また、具体的なソースコードとその実行結果を数多く掲載しました。 特に誤ったソースコードの例とそれを実行したときに出力される警告とエラーメッセージについて詳しく解説するようにしました。 それらが初心者を惑わし、彼らの学習意欲を削がないようにするためです。
本書は前編と後編に分かれていて、今回お届けするのは前編です。前編の主要なテーマは、モジュール、関数、データ型、パターンマッチングなどです。 後編では構造体、ポリモーフィズム、ビヘイビア、メタプログラミング、並行プログラミングなどを扱います。 後編は『Elixir実践ガイド アドバンスド編』として出版される予定です。
前編はさらに5つの部に分かれています。第I部では、Elixirプログラミングに関する基礎概念をやや駆け足で紹介します。 データ型、モジュール、関数、マクロ、パターンマッチング、パイプ演算子など、Elixirの特徴的な言語仕様をここで学んでください。 Elixir開発環境の構築手順はChapter 2で解説します。
第II部では、モジュールと関数について詳しく説明します。マクロについても触れますが、あまり深くは追求しません。マクロは後編で扱う予定です。 第III部では、Elixirのデータ構造を扱います。特にリスト(Chapter 12)とマップ(Chapter 14)に多くのページが割かれています。
「魅惑のElixirワールド」と題された第IV部の主役はパターンマッチングです。Elixirに「継承」がなくても困らないのは、この言語仕様のおかげです。 この部では他にも「内包表記」や「reduce関数」などの興味深いテーマを扱います。
第V部では三目並べを題材として開発演習を行います。前半は準備作業です。 まず、ElixirのテストフレームワークExUnitとElixirのビルドツールMixの使い方を解説します。 次に、演習に必要な道具立てとしてエージェントとGenServerという2つの概念を説明します。 第V部の後半では、実際にアプリケーションを開発していきます。この開発演習を通じて読者はさまざまなノウハウを習得できます。 例えば、複数個のモジュールを組み合わせた「プロジェクト」単位で開発を進める方法、ターミナル上でユーザーと対話する方法、 アプリケーション内にデータを保持する方法、テストを書いて実行する方法、など。
第3章から第25章までの各章末には練習問題が用意されています。 本を読むだけでプログラミング言語を習得するのは難しいので、ぜひ巻末付録の答えを見ずに挑戦してみてください。
2020年11月
黒田 努
目次
-
Part 1
-
Chapter 1 イントロダクション
- 1.1 Elixirとは
- 1.2 ElixirとErlangの関係
-
Chapter 2 Elixir開発環境の構築
- 2.1 Elixirコンテナを作成する
- 2.2 Elixirコンテナの利用法
-
Chapter 3 Elixirの基礎(1)
- 3.1 Elixirプログラムが動く仕組み
- 3.2 基本的な概念
- 3.3 練習問題
-
Chapter 4 Elixirの基礎(2)
- 4.1 データ型
- 4.2 数値
- 4.3 アトム
- 4.4 文字列
- 4.5 リスト、文字リスト、タプル、キーワードリスト、マップ
- 4.6 関数
- 4.7 型の判別
- 4.8 練習問題
-
Chapter 5 Elixirの基礎(3)
- 5.1 変数とパターンマッチング
- 5.2 関数、モジュール、マクロ
- 5.3 練習問題
-
Chapter 6 Elixirの基礎(4)
- 6.1 演算子
- 6.2 ファイルシステムと入出力
- 6.3 ifマクロ、forマクロ、Range構造体
- 6.4 練習問題
-
Chapter 1 イントロダクション
-
Part 2
-
Chapter 7 モジュール
- 7.1 モジュールの定義
- 7.2 モジュールの別名
- 7.3 モジュール属性
- 7.4 練習問題
-
Chapter 8 関数(1)
- 8.1 無名関数
- 8.2 名前付き関数
- 8.3 関数とキーワードリスト
- 8.4 練習問題
-
Chapter 9 関数(2)
- 9.1 関数呼び出しの分類と関数の可視性
- 9.2 キャプチャ演算子
- 9.3 importディレクティブ
- 9.4 練習問題
-
Chapter 10 マクロの初歩と条件分岐
- 10.1 マクロの初歩
- 10.2 ifマクロ
- 10.3 condマクロ
- 10.4 練習問題
-
Chapter 7 モジュール
-
Part 3
-
Chapter 11 アトム
- 11.1 アトムとは
- 11.2 アトムを扱う関数
- 11.3 アトムの役割
- 11.4 練習問題
-
Chapter 12 リスト
- 12.1 リストを作る
- 12.2 リストを利用する
- 12.3 リストを別のリストに変換する
- 12.4 リストのデータ構造
- 12.5 ヘッド、テール、コンス演算子
- 12.6 練習問題
-
Chapter 13 タプルとキーワードリスト
- 13.1 タプル
- 13.2 キーワードリスト
- 13.3 練習問題
-
Chapter 14 マップ
- 14.1 マップの基礎知識
- 14.2 マップを利用する
- 14.3 マップに対する基本操作
- 14.4 マップのデータ構造
- 14.5 練習問題
-
Chapter 15 ビットストリング、バイナリ、文字列、文字リスト
- 15.1 ビットストリング
- 15.2 バイナリ
- 15.3 文字列(1)
- 15.4 文字列(2)
- 15.5 文字列を扱う関数
- 15.6 バイナリのデータ構造
- 15.7 文字リスト
- 15.8 演習問題
-
Chapter 11 アトム
-
Part 4
-
Chapter 16 パターンマッチング
- 16.1 パターンマッチングとは
- 16.2 リストに対するパターンマッチング
- 16.3 タプルに対するパターンマッチング
- 16.4 マップに対するパターンマッチング
- 16.5 バイナリ・文字列に対するパターンマッチング
- 16.6 ビットストリングに対するパターンマッチング
- 16.7 ピン演算子
- 16.8 関数の引数に対するパターンマッチング
- 16.9 練習問題
-
Chapter 17 Enumモジュール
- 17.1 Enumerable
- 17.2 Enumerableを同じ要素数のリストに変換する関数
- 17.3 Enumerableの全部または一部をリストに変換して返す関数
- 17.4 Enumerableに属する1個の要素を返す関数
- 17.5 真偽値を返す関数
- 17.6 その他の関数
- 17.7 練習問題
-
Chapter 18 forマクロ
- 18.1 forマクロの基本
- 18.2 ジェネレータとフィルタを使いこなす
- 18.3 :intoオプション
- 18.4 ビットストリングジェネレータ
- 18.5 練習問題
-
Chapter 19 caseマクロとwithマクロ
- 19.1 caseマクロの基本的な使い方
- 19.2 caseマクロの利用例
- 19.3 withマクロ
- 19.4 練習問題
-
Chapter 20 複数の節を持つ関数
- 20.1 複数の節を持つ無名関数を作る
- 20.2 複数の節を持つ名前付き関数
- 20.3 名前付き関数の節に対するガード
- 20.4 練習問題
-
Chapter 21 reduce関数
- 21.1 アキュムレータ
- 21.2 reduce関数の利用例
- 21.3 練習問題
-
Chapter 22 エラー処理
- 22.1 例外
- 22.2 スロー
- 22.3 練習問題
-
Chapter 16 パターンマッチング
-
Part 5
-
Chapter 23 ExUnit
- 23.1 ExUnit入門
- 23.2 テストの書き方
- 23.3 練習問題
-
Chapter 24 Mix
- 24.1 Mixプロジェクト
- 24.2 最初の実装
- 24.3 機能拡張
- 24.4 練習問題
-
Chapter 25 エージェントとGenServer
- 25.1 エージェント
- 25.2 GenServer
- 25.3 練習問題
-
Chapter 26 三目並べ(1)
- 26.1 開発演習で作るアプリケーションの仕様
- 26.2 アプリケーションの骨格の作成
- 26.3 ゲームの状態を管理するエージェント
- 26.4 コンソール
- 26.5 playタスクの定義
-
Chapter 27 三目並べ(2)
- 27.1 ゲームの状態を表示する
- 27.2 手番の管理
- 27.3 格子の更新
- 27.4 画面のリフレッシュ
-
Chapter 28 三目並べ(3)
- 28.1 結果判定
- 28.2 コンピュータに手を選ばせる
-
Chapter 23 ExUnit
- 付録A 練習問題の解答