手続きの再帰とプロセスの再帰

SICPのp.19に再帰的プロセスと再帰的手続きを混同しないようにとかいてあるのだけれど、

perl - to goto or not to goto, that's the continuation

と、そこから張られた一連のリンクを読んでいてなんとなく掴みかけてきた感じがした。

あとはコメントの、continuationってgotoの意味論研究の過程で生み出された抽象概念ですよ。っていうあたりとか。

なんでも再帰も僕の理解にお役立ち。

なんでも再帰

末尾再帰がループと同等に実行されるのは、コンパイラによるオプショナルな最適化ではない。 Schemeは、末尾呼び出しでスタックを消費しないことを言語規格上要求している。

ProductName 計算機プログラムの構造と解釈
ジェラルド・ジェイ サスマン
ピアソンエデュケーション / 4830円 ( 2000-02 )


SICPおもろい。

catwalkの使い方がメインのスクリーンキャスト

TurboGearsのTrac にスクリーンキャストが幾つかあったので英語の勉強も兼ねて見てた。

TurboTunesTutorial.movでCatwalkの使い方が解説されてた。

elispで平方根

相変わらずSICPをelispで

ProductName 計算機プログラムの構造と解釈
ジェラルド・ジェイ サスマン
ピアソンエデュケーション / 4830円 ( 2000-02 )


(defun goodenough (guess x)(< (abs (- (* guess guess) x)) 0.001))
(defun improve (guess x) (average guess (/ x guess)))
(defun average (x y) (/ (+ x y) 2))
(defun sqlt_it (guess x)
 (if (goodenough guess x)
      guess
    (sqlt_it (improve guess x) x)))

(sqlt_it 1.0 5)
2.2360688956433634

Catalystのマニュアルをpdfで

Journal of Yanick (3196)

Catalyst manual into a cute little pdf

200ページ以上あるヨ

SICP 演算子に合成式

elispでSICP

SICPの問題1.5は演算子を合成式にできることを確かめましょうという問題なのだけど、elispだとどうもうまくいかない。

結局演算子をクォートして、consでリストにして作ったリストをevalで評価するようにしてみた。

defun a-plus-abs-b (a b)
 (eval (cons (if (> b 0) '+ '-) '(a b))))
a-plus-abs-b

(a-plus-abs-b 10 5)
15

(a-plus-abs-b 10 -5)
15

でもこれだと演算子を合成式にできるっていうイメージとまるでかけ離れてるなぁ

ProductName 計算機プログラムの構造と解釈
ジェラルド・ジェイ サスマン
ピアソンエデュケーション / 4830円 ( 2000-02 )


Gaucheもやっぱインストールしておくべきだろうか?

elispでSICP

ここのところちょっとやる気が出ないので、違うことをして気分転換してみている。

ProductName 計算機プログラムの構造と解釈
ジェラルド・ジェイ サスマン
ピアソンエデュケーション / 4830円 ( 2000-02 )


本のサンプルはSchemeだけど、これをelisp(Meadow)で解いていくことにした(たまにHaskellでも解いてみたいが)。

1.3 3つの数を引数としてとり、大きい2つの数の二乗の和

(defun sq (a b c) (+ (if (> a b) (* a a) (* b b)) 
                     (if (> b c) (* b b) (* c c))))

(sq 4 2 3)
25

(sq -1 -2 -3)
5

elispだとdefun,setqと分けるけど、Schemeだとどちらもdefineという同じ構文を使う。

大喜

湯島の大喜かデリーのコルマにするか悩んだのだが、結局大喜に行ってみた、

待つこと20分。スタンダードなラーメンを。

うーん、旨いって感じだが、醤油がちょっときつい。麺は細くていい感じ。量は少なめで正解。

とりそばがつけそばにすべきだったか?

MochiKitのイテレータとリストを行ったり来たり

MochiKitはIter([list])でイテレータにlist(iterator)でリストになる。

で、最近お気に入りのInterpreterで動かしてみた。

>>> l = [1,2,3,4,5,6,7]
[1, 2, 3, 4, 5, 6, 7]
>>> i = iter(l)
arrayLikeIter(...)
>>> i.next()
1
>>> i.next()
2
>>> i.next()
3
>>> list(i)
[4, 5, 6, 7]

なるほど牧場。

Meadowのブックマーク機能

フォントの設定変えようとしてC-右クリックとか色々やってたら見つけた。というか、知ってたけど今まで無視してた。最近フレームワークをいじることが多くてファイルを行ったりきたりするのでふと覚えてみようと思い立った。

ブックマークする

C-x r m

リストを表示する

C-x r l

この二つを覚えておけばいいだけ。てか便利すぎ、なんで今まで使わなかったんだろうか?

あと

C-x r b bookmark

で直接ブックマーク先を開けるけど、別に知らなくてもあんま困らん。

Mochikitをまなぶ

MochiKitのSignalとかイテレータの使い方がイマイチわからんなぁと思ってたがMochiKitのテストスクリプトを読めばいいことに気がついた。

あとinterpreterを使いまくってるのと、Firebugの便利さを理解した。