GREE勉強会「セルの海 マクロの空」

勉強会本編

株式会社インターネットイニシアティブ 山本和彦さんの発表
GREEのページの下の方に発表資料のPDFがあるので、かいつまんでまとめ&感想。

Lispことはじめ
  • Lisp以外の言語にはシンボル自身というデータがない→シンボルがLisp特有というのはそういう事
  • クオート付き()はそれ自身なのでデータ
  • クオートなしなら評価される→関数呼び出し
  • quoteされるというのがとても大事
セルはどうして2つのポインタなのか?

(Scheme用語ではペア)

  • リストをセルの連なりという複雑な表記で表している
  • セルが一つのポインタだとリストしか作れない
Lispのマクロはどんな風に使うのか?

Lispデザインパターン(p38)はとても重要。
特に以下の二つについては非関数型のLLでも生かせると思う。

  • 副作用のある関数とない関数を分ける
  • 「仕事」と「データの走査」を分ける方の高階関数


例題:FizzBuzzの進化。
ループ→高階関数→直交→マクロ

  1. ループ…手続き型言語での通常のFizzBuzz解法とほぼ同じ
  2. 高階関数…データの走査をmap関数に任せる
  3. 直交…再利用可能にする
  4. マクロ…とにかくスマートに書けて便利な事はわかったがよくわからない

Paul Graham普通のやつらの上を行け(2001年)に、
Lispで1960年台〜1970年代に導入された技術の中で、
GCと実行時型判定は既にポピュラーになり、
レキシカルクロージャはようやく「レーダーの端に捉えられはじめた」が、
マクロはまだ未知の世界だという話がある。


山本さんによると、この「レーダーの端に捉えられはじめた」というのは
AjaxによるJavaScriptの再評価の時期にクロージャが活用されるようになった事なのではないかとのこと。

データと関数の区別がないとはどういうことか?

この事を説明するためにLispインタプリタを実装する話
色々実装して行った結果「関数というのは第一要素がlamdaであるだけのただのリスト」であることがわかった。

全体の感想

  • Lispは少々齧っていたので今回の話を全部理解したかったが、そんなに甘くはなかった。
  • 後半の話は言わんとしている事はわかったが、マクロ•インタプリタ実装についてはちゃんと理解できなかった。
    • 前者はプログラミングGauche、後者はThe Little Schemerで勉強すると良さげ

懇親会

主にid:t_ishidaと話をした。
java-jaの人だとばっかり思ってたので違っててびっくり。