The Little Schemer

value関数(完結)

一応今回で「The Little Schemerの勉強垂れ流し日記」は完結。 残るアクションは1つ。 ということで、今回は*application関数をば。定義は以下。 ;; アクション本体 (define *application (lambda (e table) (_apply (meaning (function-of e) table) (evli…

value関数(その3)

それじゃ、id:yagiey:20081114で紹介した6種類のアクションを実装していくことにする。 まずは*const関数。(半角のアステリスク記号は、はてな記法に解釈されるため、ソースコード以外の箇所では全角文字で表記) 早速定義を示すと、 (define *const (lamb…

value関数(その2)

ようやく読了したよ、The Little Schemer。 ということで、あと2、3回くらいでこの本に関する日記も終わりそう。さて、まずS式を受け取って、そのS式のタイプ(id:yagiey:20081107の表を参照)に応じた動作をする関数(以下、アクション)を返すexpression-t…

value関数(その1)

データとしてのリストを受け取り、それをプログラムとして解釈して評価するvalue関数をつくろうじゃないか、というお話。 たとえば、 (car (quote (a b))) というリスト(関数適用じゃない、データとしてのリスト)に関して、 (value '(car quote (a b))) の…

テーブルから名前の検索

久しぶりにThe Little Schemer。 9章までは終わってたから、最終章の10章をば。 いろんな人が書いたレビューなどによると、この章ではSchemeを用いてScheme処理系を実装するのだそうだ。 The Little Schemerって、「この章の目標は○○が出来るようになる事で…

よーしパパ、関数に名前を付けずに再帰させちゃうぞぉ!(完結編)

L 以下の関数におけるmk-lengthを自分自身に適用する部分を関数に置き換えてみ。 (コメントの「←ここ」の箇所) ((lambda (mk-length) (mk-length mk-length)) (lambda (mk-length) (lambda (l) (cond ((null? l) 0) (else (+ 1 ((mk-length mk-length) ; ←…

よーしパパ、関数に名前を付けずに再帰させちゃうぞぉ!(その9)

実は、「無名関数で再帰する」っていう目標はすでに達成されてる。(気づいてた? ただ、このままだとリストの長さを調べるという機能限定になってしまう。 そこで、再帰させたい関数を引数として与えると、再帰関数を戻り値(って言っていいのかな?)とし…

よーしパパ、関数に名前を付けずに再帰させちゃうぞぉ!(その8)

今日は体調が悪かったので、仕事を休んだ。 おかげで布団に入って、脳内でいくらでもscheme出来たよ。 その結果、自分のやり方に限界があったんじゃないってことに気づいた。 ((lambda (mk-length) (mk-length mk-length)) (lambda (mk-length) (lambda (l) …

よーしパパ、関数に名前を付けずに再帰させちゃうぞぉ!(その7)

どこまでやったけな...。多分この前は、 ((lambda (mk-length) (mk-length mk-length)) (lambda (mk-length) (lambda (l) (cond ((null? l) 0) (else (+ 1 ((mk-length eternity) (cdr l)))))))) を、 ((lambda (mk-length) (lambda (l) (cond ((null? l) 0)…

よーしパパ、関数に名前を付けずに再帰させちゃうぞぉ!(その6)

L mk-lengthがmk-lengthに渡されたってことは、さらに再帰させるために引数を使うことができるのかな? R そうさ。 mk-lengthを一回使えばlength1ができるよ。 ((lambda (mk-length) (mk-length mk-length)) (lambda (mk-length) (lambda (l) (cond ((null? …

よーしパパ、関数に名前を付けずに再帰させちゃうぞぉ!(その4)

length0_4で使われているlengthは、mk-lengthであっても一向に構わないそうだ。 ということで、今後はこれをlength0_4とする。 (define length0_4 ((lambda (mk-length) ; (*1) (mk-length mk-length)) (lambda (mk-length) ; (*2) (lambda (l) (cond ((null…

よーしパパ、関数に名前を付けずに再帰させちゃうぞぉ!(その5)

「mk-lengthを任意の関数に永遠に適用し続ける必要がないよ」的な素振りを見せつつ、このままじゃ何も状況は変わらなくね? length0_4の要領でlength1_4とlength2_4を書くと (define length1_4 ((lambda (mk-length) (mk-length (mk-length mk-length))) (la…

よーしパパ、関数に名前を付けずに再帰させちゃうぞぉ!(その3)

続き。 length0_3とlength1_3とlength2_3に書き換えることで、結構コードも簡潔になった。 しかし、まだ「名前を付けずに再帰」という目標にはたどり着いてない。 なんとかせんとねー。 L 再帰ってどんなんよ? R mk-lengthを任意の関数へ無限に適用するみた…

よーしパパ、関数に名前を付けずに再帰させちゃうぞぉ!(その2)

続き。 length0_2、length1_2、length2_2には依然として「あるパターンの繰り返し」が見える。 よし、これを取り除いていこうじゃないか、と。

よーしパパ、関数に名前を付けずに再帰させちゃうぞぉ!(その1)

前回は、「defineできない関数が存在するみたいだねー。アハハ」って感じで終わったけど、 defineって何だろう? 再帰的な定義って何だろう? って話題は続いていく。 これ以降、defineせずにリストの長さを求める再帰関数を作る過程を述べている模様。

定義できない関数will-stop?

引数で与えられた関数が停止するかどうか調べる関数will-stop?を書いてみろよ。 あ、問題を簡単にするために、引数で与える関数の引数は空リストしか考えなくていいや。 というLeftcolumn氏の仰せです。

続けることにした

length*とweight*のくだりが分からなくてThe Little Schemerを読むのやめようとも思ったが、やめなくてよかったよ! ざっと目を通したら、この後がアツい内容っぽい。

やーめた

よし! length*とweight*のくだりは置いといて、さっさと先に進もうっと。

立ち戻る

さて、length*関数が出てくるまでのやりとりについて振り返ってみる。 何か見えてくるかもしれん、との淡い期待を込めて。

いまだに分からん

The Little Schemer 159ページ中ほどから Mr.Leftcolumn(以下L alignの引数にあるアトムの個数を数える関数を書けるかい? Mr.Rightcolumn(以下R もちろんさ (define length* (lambda (pora) (cond ((atom? pora) 1) (else (+ (length* (first pora)) (len…

理解できない。進まない。

The Little Schemerの第9章、151ページあたりから、がぜん理解できない。 partialとtotalは対義語として使われているような気がする。 partial functionは「再帰呼び出しが永遠に続く可能性がある関数」という意味だから、total functionの意味がその反対な…

partial function

以下のような関数、looking関数が9章にて出てくる。 (define pick (lambda (n lat) (cond ((= n 1) (car lat)) (else (pick (- n 1) (cdr lat)))))) (define keep-looking (lambda (a sorn lat) (cond ((number? sorn) (keep-looking a (pick sorn lat) lat)…

The Littile Schemer 8章"Lambda the Ultimate"読了

最後の関数、evens-only*&coも難しいです。 何がムズいって、(car l)がリストだった時の書き方かなぁ...。 要素が数字のみのネストしたリストlを受け取って、奇数だけ除去して返す関数evens-only*を継続渡しスタイルに書きなおす問題です。 参考までに、継続…

multiinsertLR&coを書いてみた

これだよ、これ! 継続渡しスタイルの関数を1から自分で書けるようになるには、書く練習しなきゃね! ということで、以下のようなmultiinsertLR関数を、継続渡しスタイルで書き直す練習です。 (define multiinsertLR (lambda (new oldL oldR lat) (cond ((nu…

multirember&coをトレースしてみる

fact/cpsでやった要領で、multirember&coもトレースしてみる。 っていうか、今からやるようなことはちゃんと本でやってますね。 継続渡しがわかんねワカンネ言ってましたが、継続渡しが分からないんじゃなくて英語が読めてないだけでした。 僕くらい脳みそが…

継続

能無しな僕ですが、かの有名なSICPを読んでみたいと思い、Schemeを勉強してます。 んで、その準備にと"The Little Schemer"を読んでます。これも名著。 終わったら"The Seasoned Schemer"に進むつもり。 8章のmultirember&co関数あたりで難易度が上がってる…