素数夜曲: 女王陛下のLISPを注文した

800ページ超えってことは、CTMCP並の分厚い本が届くということなのだろうか?

ProductName 素数夜曲: 女王陛下のLISP
吉田 武
東海大学出版会 / 3780円 ( 2012-06-26 )


数学学習の“全方位独学法”を提供する。数学の女王と讃えられる整数論を主題とし、その頂に登る為の様々な手法を紹介する。ラムダ計算と函数型言語を論じて整数論をLISPの方言であるSchemeにより表現し、豊富な図版と挿画で本質に迫る。

Schemeで整数論ってことはProject Eulerへの誘いとなっているのだろうかね。

継続を渡す(scheme修行14章)

leftmostの実装

(define atom?
  (lambda (x)
    (and (not (pair? x)) (not (null? x)))))

(define leftmost
  (letrec
      ((lm (lambda (l out)
         (cond
          ((null? l) (quote ()))
          ((atom? (car l))
           (out (car l)))
          (else
           (let ()
         (lm (car l) out)
         (lm (cdr l) out)))))))
    (lambda (l)
      (let/cc skip
    (lm l skip)))))

実行結果

gosh> (leftmost '((() (5 4) 1) 2 3))
5

面白い部分は次の継続を関数に渡しているところと

(let/cc skip (lm l skip)

let () で次々に関数を実行しているところ。

(let ()
  (lm (car l) out)
  (lm (cdr l) out))

アトムが見つかればその時点でそれ以降の計算はキャンセルされるので次々に実行する処理を書いていい。

ちょっと悟りが開けた。

この本面白いなぁ、何度が読みなおすことになりそう。

ProductName Scheme修行
Daniel P. Friedman and Matthias Felleisen
オーム社 / 2940円 ( 2011-06-15 )


ホップ、スキップ、ジャンプ (schemeで継続)

scheme 修行では早々に継続(letcc)が出てくる。

(define rember-upto-last
  (lambda (a lat)
    (let/cc skip
       (letrec
           ((R (lambda (lat)
             (cond
              ((null? lat) (quote ()))
              ((eq? (car lat) a)
               (skip (R (cdr lat))))
              (else (cons (car lat)
                  (R (cdr lat))))))))
         (R lat)))))

これはリストの中の指定した要素以降のリストを返す(要素が見つからなければすべてのリストを返す)

gosh> (rember-upto-last 'three '(one two three four five))
(four five)

なんでも継続によれば継続とは

「現在の計算を続行するための情報」

とある。つまりこれが継続ということだが、Scheme修行では別の表現がされていた(p.43)

letcc hopを通り過ぎたあと、(hop M)に遭遇する前にすべきだったことを忘れなさい。そしてMが何であっても まるで (letcc hop M)の値を求めたかのようにふるまいなさい

上のコードでは、skip (R (cdr lat))を通るときに今まで計算してきた情報を捨てて、(R (cdr lat))を実行する。つまり現在の計算を続行するための情報 を伴ってRにジャンプしている。

ProductName Scheme修行
Daniel P. Friedman and Matthias Felleisen
オーム社 / 2940円 ( 2011-06-15 )


Scheme修行 11章

JGPによるとjavascriptはCの皮を被ったLispだからLISPの作法にも慣れておくと良いと思うのです。というよりこのシリーズは面白いので読むといいと思います。

ProductName Scheme修行
Daniel P. Friedman and Matthias Felleisen
オーム社 / 2940円 ( 2011-06-15 )


two-in-a-rowっていうリストの中に同じ値が隣あっているかどうかを調べる関数を定義する。

まずは相互再帰

(define two-in-a-row?
  (lambda (lat)
    (cond
     ((null? lat) #f)
     (else
      (is-first-b? (car lat) (cdr lat))))))

(define is-first-b?
  (lambda (a lat)
    (cond
     ((null? lat) #f)
     (else (or (eq? (car lat) a)
           (two-in-a-row? lat))))))

これを直接再帰に書き直す。

(define two-in-a-row-b?
  (lambda (preceeding lat)
    (cond 
     ((null? lat) #f)
     (else (or (eq? (car lat) preceeding)
           (two-in-a-row-b? (car lat)
                (cdr lat)))))))

(define two-in-a-row-2?
  (lambda (lat)
    (cond
     ((null? lat) #f)
     (else (two-in-a-row-b? (car lat)
                (cdr lat))))))

8/20にJGPの読書会@静岡があります。

ProductName JavaScript: The Good Parts ―「良いパーツ」によるベストプラクティス
Douglas Crockford
オライリージャパン / 1890円 ( 2008-12-22 )


Scheme修行

お、日本語訳でるのか!というわけで早速注文。

ProductName Scheme修行
Daniel P. Friedman and Matthias Felleisen
オーム社 / 2940円 ( 2011-06-15 )


Schemeを学ぶための定番書を初翻訳! プログラミング言語Scheme は、Lispの代表的な方言であり、計算機科学においてプログラミングを学ぶ上でもっとも適した言語のひとつでもあります。本書は、2010年10月発行『Scheme 手習い』(原題:“The Little Schemer, Fourth Edition”)の続編である“The Seasoned Schemer”を翻訳したものです。『Scheme 手習い』同様の対話形式で、状態やスコープ、継続といった、Schemeと計算機科学のさらなる話題を扱っています。

2010年に読んだ本

今年読んで良かった本をビジネス系と技術系で5つずつあげてみる。

ビジネス本は読んだ量の割に心に残るものは少なかったけど内容がいい本は深くて色々考えさせられた。特に「イシューからはじめよ」はピカイチだった。

技術書は前半はPK-PDの本とか読んでいて、後半はプログラミング関係をそこそこ読んだ。Ruby関連の本が面白かったような気がする。エキスパートPythonプログラミングも大きい。

ビジネス本

とんがり

ProductName 小さなチーム、大きな仕事―37シグナルズ成功の法則 (ハヤカワ新書juice)
ジェイソン・フリード
早川書房 / ?円 ( 2010-02-25 )


ログをとるのは楽しい

IT業界に限らず、変化が激しい業界では短期的な成果を出すことも、長期的な視野での成果(つまり自分の成長)もきちんと考えることが大切だと思う。

自分で自分を経営しているって感覚が当たり前になるんだろうなと思っている

ProductName 経営の教科書―社長が押さえておくべき30の基礎科目
新 将命
ダイヤモンド社 / 1680円 ( 2009-12-11 )


昨日読み終わったので感想記事を書いてないが、すごく良かった。ピンと来る人にはグイグイ引き込まれる内容。

ProductName イシューからはじめよ―知的生産の「シンプルな本質」
安宅和人
英治出版 / 1890円 ( 2010-11-24 )


技術書

5章まで残り。何度か読みなおしてPythonへの理解を深めていくための本

ProductName エキスパートPythonプログラミング
Tarek Ziade
アスキー・メディアワークス / 3780円 ( 2010-05-28 )


月曜日から金曜日に章が分かれていてメタプログラミングを学んでいく

ProductName メタプログラミングRuby
Paolo Perrotta
アスキー・メディアワークス / 2940円 ( 2010-08-28 )


バリバリEmacsを使っているEmacs使いが、作業効率をカイゼンしてさらにバリバリ使うようになるための本

継続やYコンビネータを知るために。独特の形式もまた読んでて楽しい

ProductName Scheme手習い
Daniel P. Friedman
オーム社 / 2940円 ( 2010-10-22 )


創薬研究の問題解決の方法論としても参考になることは多い

ProductName Redmineによるタスクマネジメント実践技法
小川 明彦
翔泳社 / 3444円 ( 2010-10-13 )


「Scheme手習い」を読んだ

これは評判通りの良書。

ProductName Scheme手習い
Daniel P. Friedman,Matthias Felleisen
オーム社 / ¥ 2,940 ()
在庫あり。

最初のほうはさらさら読めて、僕は7章からが面白かった。

7章では関数とは何か?ということが集合から説明されていく。有限関数の表現の仕方とか一対一対応とか。

8章はlamdaから始まって継続の話でこれは面白いがさらっと流れる。継続とは何かということは良く考えないと出てこないかも

9章はコラッツの問題,アッカーマン関数が出てきて最後にY-combinator

pythonで書いてみた( fact(5) )。

(lambda g: (lambda f: g(lambda arg: f(f)(arg))) 
(lambda f: g(lambda arg: f(f)(arg))))
(lambda f: lambda n: (1 if n<2 else n*f(n-1)))(5)

10章はSchemeを実装する話で、Javaなんかで実装したことがあるが、こっちのほうが環境の動きというものがよくわかった。

8,9,10は色々分かっている人向けかな。でもちょっとは知っていればかなり理解が進むし、深まり度も高まってオススメかも。

Scheme手習い

悩む

ProductName Scheme手習い
Daniel P. Friedman,Matthias Felleisen
オーム社 / ¥ 2,940 ()
近日発売 予約可

ほしい物リストスタックが積まれてないし、買ってもよいかなと思っている。

pythonのスコープではまる

ちょっとはまった。結局オブジェクト作って解決しといたけど気持ち悪いので少し調べた。(でも未解決)

クロージャでカウンタを考える。Open Source WEBを参考に

perlだと

sub make_counter {
  my $c = $_[0] || 0;
  return sub { $c++ }
}

gaucheだとこんな感じ

(define (make-counter n)
  (let1 c n
    (lambda () (inc! c))))

でもpythonだとだめなの

def make_counter(n):
    c = n
    def counter():
        c = c + 1
        return c
    return counter

スコープの洗礼をうけた。参照できても代入できないのでglobalにする必要が。

def make_counter(n):
    c = n
    def counter():
        global c
        c += 1
        return c
    return counter

ctr = make_counter(5)
ctr()
ctr()

Traceback (most recent call last):
  File "C:\home\kzfm\test.py", line 10, in <module>
    ctr()
  File "C:\home\kzfm\test.py", line 5, in counter
    c += 1
NameError: global name 'c' is not defined

とかいってglobalでも駄目だ。

SICP5章 schemeでレジスタ計算機を模倣する

ずっと5章に興味が持てなくてほったらかしにしていたのだけど、読み始めた。5章は毛色が違うように感じてたのと、単に関数型言語が知りたいだけだったら3章までで満足できて、計算機の話って何が面白いんだろうか?なんて思ってたのだけど、(僕の場合)以下のような道のりを経て5章にたどり着いた。

EsoteicでVMとかエミュレータみたいなもんに興味がわいた。あと中間言語

Bolicとか。そういえばゲノム言語とかつくったみたな。

ProductName Rubyで作る奇妙なプログラミング言語 ~Esoteric Language~
原 悠
毎日コミュニケーションズ / ¥ 2,814 ()


プログラミングの力を生み出す本

Cのプログラムをアセンブリから眺めてみる。レジスタとかメモリとか意識できるようになった。

ProductName プログラミングの力を生み出す本―インテルCPUのGNUユーザへ
橋本 洋志,松永 俊雄,冨永 和人,石井 千春
オーム社 / ¥ 2,625 ()


CPUの創りかた

4bitCPUつくる。半加算器とか全加算器が論理回路でつくれるとかそういう話は楽しい。

ProductName CPUの創りかた
渡波 郁
毎日コミュニケーションズ / ¥ 2,940 ()
在庫あり。

SICP5章

という長い道のりを経て、やっとSICP5章。

ProductName 計算機プログラムの構造と解釈
ジェラルド・ジェイ サスマン,ジュリー サスマン,ハロルド エイブルソン
ピアソンエデュケーション / ¥ 4,830 ()
在庫あり。

数日かけてバグとって、実際にGCDマシンが動いた時にはかなり感動。

gosh> (set-register-contents! gcd-machine 'a 206)
done
gosh> (set-register-contents! gcd-machine 'b 40)
done
gosh> (start gcd-machine)
done
gosh> (get-register-contents gcd-machine 'a)
2

デバッグしながら中身の動きが理解できた。