kb84tkhrのブログ

何を書こうか考え中です あ、あと組織とは関係ないってやつです 個人的なやつ

2016-01-01から1年間の記事一覧

Scheme修行(16) 第20章 店には何がある?(続きの続きの続き)

私の空気読みによると、なんかletやletrecは宿題ね、と言われているような気がする lambdaができてるからきっと簡単にできるはず えーとlambdaしてapplicationするということだから (define binds-of (lambda (x) (car (cdr x)))) (define letbody-of (lambd…

Scheme修行(15) 第20章 店には何がある?(続きの続き)

lambdaは手習いのvalueにもありましたが、set!が出てきた関係で 複数の式を書けるようにする必要があります (define *lambda (lambda (e table) (lambda (args) (beglis (body-of e) (multi-extend (formals-of e) (box-all args) table))))) クロージャの作…

第20章 店には何がある?(続き)

the-meaningです (define the-meaning (lambda (e) (meaning e lookup-in-global-table))) (define lookup-in-global-table (lambda (name) (lookup global-table name))) global-tableにおけるmeaningは特別ということでtheがついてるんでしょうね lookup-i…

Scheme修行(13) 第20章 店には何がある?

ついにScheme修行も最終章 あいかわらずよく意味の分からないタイトルで締めてくれます 第10章とおなじく、ここではschemeのインタプリタを作ります 今回はdefineが(letccも)実装されますのでそのままセルフで自分自身を実行することができるはず 今回もな…

Scheme修行(12) 第19章 宝石泥棒(続きの続き)

前回のwaddleはもともと再帰がややこしいところにlet/ccが入ったので なんだかよくわからないことになってましたが leaveとfillだけの話ならこんな感じでぴょんぴょんさせることができます (define A (lambda () (let/cc here (set! leave here) (display "A…

Scheme修行(11) 第19章 宝石泥棒(続き)

two-in-a-row?です (define two-in-a-row? (letrec ((W (lambda (a lat) (cond ((null? lat) #f) (else (let ((nxt (car lat))) (or (eq? nxt a) (W nxt (cdr lat))))))))) (lambda (lat) (cond ((null? lat) #f) (else (W (car lat) (cdr lat))))))) two-in…

Scheme修行(10) 第19章 宝石泥棒

deepです (define deep (lambda (m) (cond ((zero? m) (quote pizza)) (else (cons (deep (sub1 m)) (quote ())))))) (deep 6)としてやると((((((pizza))))))ができますが ((((((pizza))))))ではなく((((((mozzarella))))))を作るにはどうしたら いいでしょ…

Scheme修行(9) 第18章 我変わる、ゆえに我同じなり!

cons、car、cdrをlambdaで書いてしまいます (define kons (lambda (kar kdr) (lambda (selector) (selector kar kdr)))) (define kar (lambda (c) (c (lambda (a d) a)))) (define kdr (lambda (c) (c (lambda (a d) d)))) Schemeのコア中のコアと思っていた…

Scheme修行(8) 第17章 我変わる、ゆえに我あり!

ふたたびdeepM deepを内部に持つバージョンから始めます (define deepM (let ((Rs (quote ())) (Ns (quote ()))) (letrec ((D (lambda (m) (if (zero? m) (quote pizza) (cons (D (sub1 m)) (quote ())))))) (lambda (n) (let ((exists (find n Ns Rs))) (if…

Scheme修行(7) 第16章 位置について、セット、バン!

前回の代入では代入前の値は捨てられていましたが、今回は引数をため込んでいきます こんな関数で (define ingredients (quote ())) (define sweet-toothR (lambda (food) (set! ingredients (cons food ingredients)) (cons food (cons (quote cake) (quote…

Scheme修行(6) 第15章 大人と子供の違い・・・・・・

代入です set!はdefineされた変数に値を代入します と書くと先生に怒られるかもしれません 「名前xはaを参照しています」という言い方はここが初めてかな? こちらが正しい表現なんでしょう さっきまでaを参照していたxに、今度はbを参照させるというのがset…

Scheme修行(5) 第14章 名前をつけましょう(続き)

rember1*をいじっていきます 再掲 (define rember1* (lambda (a l) (letrec ((R (lambda (l) (cond ((null? l) (quote ())) ((atom? (car l)) (cond ((eq? (car l) a) (cdr l)) (else (cons (car l) (R (cdr l)))))) (else (let ((av (R (car l)))) (cond ((…

Scheme修行(4) 第14章 名前をつけましょう

やっとletがでてきます letをletrecよりletccより後でとりあげたのはどういうことなんでしょう? leftmost 一番左のアトムを探すleftmostです (define leftmost (lambda (l) (cond ((atom? (car l)) (car l)) (else (leftmost (car l)))))) これは引数に空リ…

Scheme修行(3) 第13章

第13章 ホップ、スキップ、ジャンプ 継続が出てきます intersectall 題材はintersectallです まずはintersectから (define intersect (lambda (set1 set2) (cond ((null? set1) (quote ())) ((member? (car set1) set2) (cons (car set1) (intersect (cdr se…

Scheme修行(2) 第12章

multirember 第12章「避難しましょう」ではまずmultiremberを題材にします (define multirember (lambda (a lat) (cond ((null? lat) (quote ())) ((eq? (car lat) a) (multirember a (cdr lat))) (else (cons (car lat) (multirember a (cdr lat))))))) mul…

Scheme修行(1) はじめに & 第11章

はじめに 「訳者まえがき」や「はじめに」はだいたいScheme手習いと似たようなことが書いてあるので さらっといきます 継続(continuation)と代入(set!)という新たな概念を使用してプログラミングの幅を広げている 継続はともかくとして、代入なんて、と思っ…

Scheme手習い(24) eval、またはvalue、またはmeaning(5)

普通のソースをdefineを使わないソースに変換する手法は 様々なシーンで役立つノウハウですのでまとめておきましょう(嘘 lambdaによる名前付け defineによる定義は、lambdaによる名前付けに書き換えることができます 修正前 (define A (lambda (a) (aaaaa))…

Scheme手習い(23) eval、またはvalue、またはmeaning(4)

でも、(define ...)はどうなのでしょう。 再帰はYコンビネータによって得られるので、必要はありません。 Yコンビネータによる変形を行うと、インタプリタ上でインタプリタを走らせることが可能であるということですか。 はい。でもそんなに悩まないでくださ…

Scheme手習い(22) eval、またはvalue、またはmeaning(3)

関数の呼び出し関係を整理してみました ちょっと細かい関数まで書きすぎたかな 以上

Scheme手習い(21) eval、またはvalue、またはmeaning(2)

いよいよ関数適用に入ります (define function-of car) (define arguments-of cdr) (define *application (lambda (e table) (ls-apply (meaning (function-of e) table) (evlis (arguments-of e) table)))) (define evlis (lambda (args table) (cond ((nul…

Scheme手習い(20) eval、またはvalue、またはmeaning

ついに最終章、ラスボス2です 小さいschemeの核にあたるもの、いわゆる?evalを作ります でもこの本ではvalueっていう名前になってます でもvalueは空っぽの環境を作るだけで実際の仕事の中心はmeaningという関数がやってます ラスボス2と言っても、Yコンビ…

Scheme手習い(19) Yコンビネータ(4)

Yコンビネータでいろいろな関数を動かしてみます (define Y (lambda (le) ((lambda (f) (f f)) (lambda (f) (le (lambda (x) ((f f) x))))))) 再帰しない関数を渡しても動くかな ((Y (lambda (add2) (lambda (n) (add1 (add1 n))))) 1) ⇛ 3 動いた! じゃあ…

Scheme手習い(18) Yコンビネータ(3)

関数を再帰させることができればYコンビネータも峠を越えたんじゃないでしょうか あとは、形を整えてやるだけのはずですから defineなしで再帰できるようになったlengthがこれ ((lambda (mk-length) (mk-length mk-length)) (lambda (mk-length) (lambda (l)…

Scheme手習い(17) Yコンビネータ(2)

defineなしで再帰を実現できたものの、わかった感が薄くて今ひとつ eternityの唐突感 (mk-length mk-length)の手品感 このあたりを解決しないと眠れそうにありません いえ寝ます いえ自分なりに納得感のある道を探してみます 厳密さよりも感覚的に納得できる…

Scheme手習い(16) Yコンビネータ

ラスボス1来ました Yコンビネータってのはこれ 正確には適用順Yコンビネータって言うらしいです (define Y (lambda (le) ((lambda (f) (f f)) (lambda (f) (le (lambda (x) ((f f) x))))))) 何がなんだかわかりません こんなの読んでふむふむとかわかっちゃ…

Scheme手習い(15) 部分関数と全関数(2)

部分関数と全関数の話その2 コラッツの関数と呼ばれるやつ 1なら終わり 偶数なら2で割る 奇数なら3を掛けて1を足す たったこれだけの関数なのに、必ず終わるかどうか、つまり全関数かどうかは証明されていません きっと全関数だろうとは思われてるみたい (d…

Scheme手習い(14) 部分関数と全関数

第9章「……もう一度、もう一度、もう一度、……」は、変な関数の話? まずは部分関数と全関数から (define looking (lambda (a lat) (keep-looking a (pick 1 lat) lat))) (define keep-looking (lambda (a sorn lat) (cond ((number? sorn) (keep-looking a (p…

Scheme手習い(13) 継続の続き

第8章「究極のlambda」の続きの続きの続き 数のリストから偶数だけを集めるevens-only*を作ります タップではなく木から集めてくるところがさっきまでとは違います これは普通の再帰だし問題ありません 次は収集子を使って、できあがりのリストと偶数の積と…

Scheme手習い(12) 継続

第8章「究極のlambda」の続きの続き Scheme手習いもそろそろ終盤 継続ってやつが出てきます 中ボスクラス Schemeはもともと継続を扱う機能を持っているんですが ここではlambdaを使って継続を手作りします たぶん原理的には同じもの では、これはどうでしょ…

Scheme手習い(11) 抽象化、部分適用

第8章「究極のlambda」の続き insertRとinsertLを高階関数に書き換えます (define insertL-f (lambda (test?) (lambda (new old l) (cond ((null? l) (quote ())) ((test? (car l) old) (cons new (cons old (cdr l)))) (else (cons (car l) ((insertL-f tes…