第13回オープンソーステクノロジー勉強会に参加してきた.

お題はLisp.LispといえばEmacs Lispしか知らず,「うはw括弧ばっかりww」的な感想しかなかったんですが,最近はSchemeやGauche(ゴーシュと読む)の登場で気にはなってました.

と言うわけでログ.

##セルの海 マクロの空

  • Lispとは?
  • セルがなぜ2つのポインターなのか?
  • Lispのマクロはどんな風に使うのか?
  • データと関数の区別がない?

==== ###Lispとは?

  • 求人がない?普通の人にはあまり理解されないのだろうか.
  • Lispは方言が多い
    • Fortranの次に古い.これは意外だ.そう言えば昔からEmacs Lispはあったよな.

:Common Lisp:提案されたものはすべて取り入れるので,仕様がかなりふくらんでいる? :Scheme:仕様が50ページのコンパクト.後で調べよう. :Emacs Lisp:これはEmacs使いなので知ってるが,書いたことはない.

  • 今日はSchemeで&参考文献

:The Little Schemer:再帰がわかるようになる本らしい.読まねば. :プログラミングGauche:これと上のでSchemeは完璧とのこと.

  • Schemeを見てみる
    • 括弧の羅列に見える
    • 読み方
    • 括弧は見ない.インデントだけ見る
    • 括弧が見えなくなると一人前?これは盲点というか.
  • Lispの基礎
    • オブジェクト指向型言語
    • すべてのオブジェクトはまず最初に評価される
    • ‘counter は (quote counter)の略
    • シンボルをシンボルとして評価する
    • リスト1
    • ’(1 2 3) -> (1 2 3)
    • クオートがついていないと関数
    • (+ 1 2 3) -> 6
    • + が関数,1, 2, 3が引数となる
    • x = 3なら
(+ (* x x) x 1)
(+ (* 3 3) x 1)
(+ 9 3 1)
13 #=> x^2 + x + 1
  • (lambda ….) が関数
    • 関数の最後の式が返値
    • 全てが式
    • 名前がなくても実行できる.無名関数か.
    • defineで名前をつける.

###セルがなぜ2つのポインターなのか?

  • Schemeではセルではなくペアと言う
  • consはセルを生成2
    • (cons 1 2) => 2に1をconsすると言う.
(1 . (2 . (3 . ())))
  • 難しい表記をしているのは再帰を書かせたいから
    • 確かにこういうセルの形式なら再帰関数が書きやすそう

:car:セルの第1要素 :cdr:セルの第2要素

  • セルの第2要素に次のセルの位置があるので,ポインターか.
  • atomかlistしかない
    • セルかそれ以外か
  • 本質と効率を分けて考える提案

###Lispのマクロはどんな風に使うのか?

  • 高階関数を使え
    • 関数を引数として使う(汎関数)
    • 関数を返す(クロージャ)
  • マクロを書け

  • 例としてFizzBuzz問題

    • 高階関数のキモ
    • 仕事とデータの走査をわける
    • データを作って,関数に各要素を渡して処理する
    • 直行性重要.やっぱり.
    • DRYの原則をのために,マクロで解決しよう
    • クロージャ
    • ガラガラヘビみたいなもの?ここがちょっとわからなかった.
    • Lispの先進性
    • ガベージコレクションや実行時型判定,クロージャなど.
    • これも意外でした.そうなのか.

###データと関数の区別がない?

  • eval(interpreter)を作る
    • 驚くほど簡単にできるらしい
    • 5つの基本関数(car/cdr/cons/eq/atom?)と,
    • 2つの特殊関数(quote/cond)で作れる
    • 関数定義(lambda/label) : #=> labelはdefineのこと
    • アラン・ケイのエピソードが出てきた.
    • 土日に資料を見て実践してみよう.
    • lambdaの評価
    • 関数とは第1要素が lambda というシンボルなだけ.なんでもセル.ある意味わかりやすい.
    • The Little Schemerの第10章を読んでみよう
    • 関数も単なるデータ
    • 関数もリスト

###質疑応答

  • デバッグは?
    • デバッガーがかなり強力
  • Lispの関数リファレンスは?
    • 方言が3つあるからねぇ・・・・
    • SchemeならプログラミングGaucheを読む
    • 最後はググろう
  • 学習を越えたプログラムを書けるようになるには?
    • ライブラリとか調べるのは,どの言語も一緒

###感想 Schemeとか勉強してみたいと思ってたんだけど,どうも取っつきにくそうでしたが,今回の話聞いてみて,週末に早速挑戦しようと思いました.全てがセルでありリストであり,それを順に評価して実行されていくと説明されてわかりやすかったですね.括弧は見ない,と言うかむしろ見えない発言には,行き着くとそうなるのかと思いましたが.

次はPythonの入門セミナーとかどこか開催しないかな(;´Д`)

##参考文献

The Little Schemer (MIT Press)

著者: Daniel P. Friedman, Matthias Felleisen
出版日: 1995-12-21
出版社/メーカー: The MIT Press
カテゴリ: Book

プログラミングGauche

著者: Kahuaプロジェクト
出版日: 2008-03-14
出版社/メーカー: オライリージャパン
カテゴリ: Book


  1. 別に配列ではないよね.Linked List的なものかな? [return]
  2. 配列ではない [return]
 
comments powered by Disqus