Skip to content

Instantly share code, notes, and snippets.

@KimiyukiYamauchi
Last active December 3, 2019 14:08
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save KimiyukiYamauchi/6df20d3ae6f96fbd494093e1af453288 to your computer and use it in GitHub Desktop.
Save KimiyukiYamauchi/6df20d3ae6f96fbd494093e1af453288 to your computer and use it in GitHub Desktop.
19/12/04 - IT College Okinawa Advent Calendar 2019

手続き型プログラマが関数型言語を触ってみて

なぜこれを書こうと思ったか

  • 30年間でいろいろな言語でソフトウェアの開発を行った。
    • アセンブラ(オフプロドライバ)
    • C言語(PC&ガラケーのフロント/エンド)
    • VisualBasic(WindowsPCのアプリ)
    • PHP(社内イントラネット)
    • SQL, PL/SQL(社内イントラネット)
    • また、開発以外でも非常勤講師の立場でJava、Javascript、pythonなど触る
  • ただ、上記はすべて手続き型言語、つまり、当方はどっぷり手続き型プログラマ
    • アセンブラは手続き型とは言わないかもしれないが非関数型言語ではある
    • Java、Javascript、pythonは関数型プログラミングが可能だが当方が対応できて
      いなかった
  • 今回、関数型言語であるCommon Lispを用いて、関数型言語を学習
  • 手続き型言語と関数型言語のパラダイム(考え方)の違いにだいぶ戸惑った
  • そのへんのところを書いてみる

ソースコード読み方の違い

  • 最初、関数型言語のソースコードはどう読んでいいのかわからず処理の流れを追う
    ことができかった。
  • 手続き型と関数型なにが違うのかをソースコードを読むという観点から見てみると

手続き型言語のソースコード

  • まずは当方のベースの知識である手続き型言語
  • 順次処理なので処理は上から下に進む
  • モジュール分割(言語によって、サーブルチーン、関数やメソッド)
    • 各モジュールをブラックボックとして見て、全体の流れを把握
    • 呼ぶ側と呼ばれる側のインタフェース(入出力)
    • 各ルーチンの詳細を確認
    • 各ルーチンがモジュール分割している場合は上記と同様な読み方を行う
  • 条件分岐、分岐の条件式の確認
  • 繰り返し、繰り返しの条件式の確認
  • で、だいたい処理内容をつかめる

関数型言語のソースコード

  • 関数のネストになっているので処理は中から外に進む。
  • モジュール分割は関数のネストで実現
    • このため処理の全体がコンパクトになり、見通しがよい
    • 手続き型言語でも同様のことはできる(やるかやらないかはプログラマ
      が決める)が、関数型言語なら必ずこの構造になる
  • 条件分岐
    • 条件分岐は正格評価または遅延評価で実装する
    • 正格評価
      • 手続き型と同じなので難しくない
    • 遅延評価
      • クロージャー
      • 構文糖衣(マクロ)
        • ちゃんと理解できていない。今後の課題
  • 繰り返し
    • 再帰や高階関数で実装する
    • 再帰 => 手続き型でも使われる処理なので難しくない
    • 高階関数
      • 数年前からOmas先生に色々教えてもらっていたので理解できた
  • 以上がソースコードからみた手続き型と関数型の違い
  • 上記の知識を利用し、ソースコードを読んで、処理の流れ理解しているレベル
  • 遅延評価は今後の課題。

関数型言語を学ぶ利点

上で説明した通り、関数型言語のソースコードは手続き型言語とはだいぶ違うので、
手続き型言語の読み方は通用しない
が、手続き型言語と比較して関数型言語が難しく読みにくいわけではない
関数型言語の構造を理解するとむしろ手続き型言語より読みやすい(たぶん)
一般的には関数型言語はプログラムの構造上、再利用や並列処理などに向いてる
と言われている
また、コーディングという観点からは

  • プログラムがコンパクトになる
  • プログラムが説明しやすくなる、読みやすくなる - 了解性の向上

参考文献

Land of Lisp

  • Conrad Barski, M.D. 著、川合 史朗 訳
  • ゲームをベースにしたサンプルが豊富(実際の処理はAIとかWeb構築など)
  • 砕けた感じの語り口だが内容は結構ハード
  • 途中、結構ブラックな内容の漫画が突然出てきたりしてなんかちょっと変な本

はじめてのLisp関数型プログラミング

  • 五味 弘 著
  • 基本的なサンプルコードが多数
  • trace、breakなどデバッグ機能の関数の説明あり
  • コンパクトにまとまっており、辞書的な利用にも向いている

最後に

  • ほんとはもっとちゃんとした文章にしたかった
  • しかしそうするとテキストの丸写しになるので
  • 結果、だいぶ稚拙な内容となってしまった
  • 次回リベンジする

以上

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment