16072012 Scheme
800ページ超えってことは、CTMCP並の分厚い本が届くということなのだろうか?
数学学習の“全方位独学法”を提供する。数学の女王と讃えられる整数論を主題とし、その頂に登る為の様々な手法を紹介する。ラムダ計算と函数型言語を論じて整数論をLISPの方言であるSchemeにより表現し、豊富な図版と挿画で本質に迫る。
Schemeで整数論ってことはProject Eulerへの誘いとなっているのだろうかね。
16072012 Scheme
800ページ超えってことは、CTMCP並の分厚い本が届くということなのだろうか?
数学学習の“全方位独学法”を提供する。数学の女王と讃えられる整数論を主題とし、その頂に登る為の様々な手法を紹介する。ラムダ計算と函数型言語を論じて整数論をLISPの方言であるSchemeにより表現し、豊富な図版と挿画で本質に迫る。
Schemeで整数論ってことはProject Eulerへの誘いとなっているのだろうかね。
17112011 Scheme
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))
アトムが見つかればその時点でそれ以降の計算はキャンセルされるので次々に実行する処理を書いていい。
ちょっと悟りが開けた。
この本面白いなぁ、何度が読みなおすことになりそう。
13112011 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にジャンプしている。
13082011 Scheme javascript
JGPによるとjavascriptはCの皮を被ったLispだからLISPの作法にも慣れておくと良いと思うのです。というよりこのシリーズは面白いので読むといいと思います。
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の読書会@静岡があります。
11062011 Scheme
お、日本語訳でるのか!というわけで早速注文。
Schemeを学ぶための定番書を初翻訳! プログラミング言語Scheme は、Lispの代表的な方言であり、計算機科学においてプログラミングを学ぶ上でもっとも適した言語のひとつでもあります。本書は、2010年10月発行『Scheme 手習い』(原題:“The Little Schemer, Fourth Edition”)の続編である“The Seasoned Schemer”を翻訳したものです。『Scheme 手習い』同様の対話形式で、状態やスコープ、継続といった、Schemeと計算機科学のさらなる話題を扱っています。
今年読んで良かった本をビジネス系と技術系で5つずつあげてみる。
ビジネス本は読んだ量の割に心に残るものは少なかったけど内容がいい本は深くて色々考えさせられた。特に「イシューからはじめよ」はピカイチだった。
技術書は前半はPK-PDの本とか読んでいて、後半はプログラミング関係をそこそこ読んだ。Ruby関連の本が面白かったような気がする。エキスパートPythonプログラミングも大きい。
ログをとるのは楽しい
IT業界に限らず、変化が激しい業界では短期的な成果を出すことも、長期的な視野での成果(つまり自分の成長)もきちんと考えることが大切だと思う。
自分で自分を経営しているって感覚が当たり前になるんだろうなと思っている
昨日読み終わったので感想記事を書いてないが、すごく良かった。ピンと来る人にはグイグイ引き込まれる内容。
5章までと残り。何度か読みなおしてPythonへの理解を深めていくための本
月曜日から金曜日に章が分かれていてメタプログラミングを学んでいく
バリバリEmacsを使っているEmacs使いが、作業効率をカイゼンしてさらにバリバリ使うようになるための本
継続やYコンビネータを知るために。独特の形式もまた読んでて楽しい
創薬研究の問題解決の方法論としても参考になることは多い
これは評判通りの良書。
最初のほうはさらさら読めて、僕は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は色々分かっている人向けかな。でもちょっとは知っていればかなり理解が進むし、深まり度も高まってオススメかも。
06102010 Scheme
ちょっとはまった。結局オブジェクト作って解決しといたけど気持ち悪いので少し調べた。(でも未解決)
クロージャでカウンタを考える。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でも駄目だ。
ずっと5章に興味が持てなくてほったらかしにしていたのだけど、読み始めた。5章は毛色が違うように感じてたのと、単に関数型言語が知りたいだけだったら3章までで満足できて、計算機の話って何が面白いんだろうか?なんて思ってたのだけど、(僕の場合)以下のような道のりを経て5章にたどり着いた。
Cのプログラムをアセンブリから眺めてみる。レジスタとかメモリとか意識できるようになった。
4bitCPUつくる。半加算器とか全加算器が論理回路でつくれるとかそういう話は楽しい。
という長い道のりを経て、やっとSICP5章。
数日かけてバグとって、実際に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
デバッグしながら中身の動きが理解できた。