2016-01-01から1年間の記事一覧
私の空気読みによると、なんかletやletrecは宿題ね、と言われているような気がする lambdaができてるからきっと簡単にできるはず えーとlambdaしてapplicationするということだから (define binds-of (lambda (x) (car (cdr x)))) (define letbody-of (lambd…
lambdaは手習いのvalueにもありましたが、set!が出てきた関係で 複数の式を書けるようにする必要があります (define *lambda (lambda (e table) (lambda (args) (beglis (body-of e) (multi-extend (formals-of e) (box-all args) table))))) クロージャの作…
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修行も最終章 あいかわらずよく意味の分からないタイトルで締めてくれます 第10章とおなじく、ここではschemeのインタプリタを作ります 今回はdefineが(letccも)実装されますのでそのままセルフで自分自身を実行することができるはず 今回もな…
前回のwaddleはもともと再帰がややこしいところにlet/ccが入ったので なんだかよくわからないことになってましたが leaveとfillだけの話ならこんな感じでぴょんぴょんさせることができます (define A (lambda () (let/cc here (set! leave here) (display "A…
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…
deepです (define deep (lambda (m) (cond ((zero? m) (quote pizza)) (else (cons (deep (sub1 m)) (quote ())))))) (deep 6)としてやると((((((pizza))))))ができますが ((((((pizza))))))ではなく((((((mozzarella))))))を作るにはどうしたら いいでしょ…
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のコア中のコアと思っていた…
ふたたび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…
前回の代入では代入前の値は捨てられていましたが、今回は引数をため込んでいきます こんな関数で (define ingredients (quote ())) (define sweet-toothR (lambda (food) (set! ingredients (cons food ingredients)) (cons food (cons (quote cake) (quote…
代入です set!はdefineされた変数に値を代入します と書くと先生に怒られるかもしれません 「名前xはaを参照しています」という言い方はここが初めてかな? こちらが正しい表現なんでしょう さっきまでaを参照していたxに、今度はbを参照させるというのがset…
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 ((…
やっとletがでてきます letをletrecよりletccより後でとりあげたのはどういうことなんでしょう? leftmost 一番左のアトムを探すleftmostです (define leftmost (lambda (l) (cond ((atom? (car l)) (car l)) (else (leftmost (car l)))))) これは引数に空リ…
第13章 ホップ、スキップ、ジャンプ 継続が出てきます intersectall 題材はintersectallです まずはintersectから (define intersect (lambda (set1 set2) (cond ((null? set1) (quote ())) ((member? (car set1) set2) (cons (car set1) (intersect (cdr se…
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手習いと似たようなことが書いてあるので さらっといきます 継続(continuation)と代入(set!)という新たな概念を使用してプログラミングの幅を広げている 継続はともかくとして、代入なんて、と思っ…
普通のソースをdefineを使わないソースに変換する手法は 様々なシーンで役立つノウハウですのでまとめておきましょう(嘘 lambdaによる名前付け defineによる定義は、lambdaによる名前付けに書き換えることができます 修正前 (define A (lambda (a) (aaaaa))…
でも、(define ...)はどうなのでしょう。 再帰はYコンビネータによって得られるので、必要はありません。 Yコンビネータによる変形を行うと、インタプリタ上でインタプリタを走らせることが可能であるということですか。 はい。でもそんなに悩まないでくださ…
関数の呼び出し関係を整理してみました ちょっと細かい関数まで書きすぎたかな 以上
いよいよ関数適用に入ります (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…
ついに最終章、ラスボス2です 小さいschemeの核にあたるもの、いわゆる?evalを作ります でもこの本ではvalueっていう名前になってます でもvalueは空っぽの環境を作るだけで実際の仕事の中心はmeaningという関数がやってます ラスボス2と言っても、Yコンビ…
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 動いた! じゃあ…
関数を再帰させることができればYコンビネータも峠を越えたんじゃないでしょうか あとは、形を整えてやるだけのはずですから defineなしで再帰できるようになったlengthがこれ ((lambda (mk-length) (mk-length mk-length)) (lambda (mk-length) (lambda (l)…
defineなしで再帰を実現できたものの、わかった感が薄くて今ひとつ eternityの唐突感 (mk-length mk-length)の手品感 このあたりを解決しないと眠れそうにありません いえ寝ます いえ自分なりに納得感のある道を探してみます 厳密さよりも感覚的に納得できる…
ラスボス1来ました Yコンビネータってのはこれ 正確には適用順Yコンビネータって言うらしいです (define Y (lambda (le) ((lambda (f) (f f)) (lambda (f) (le (lambda (x) ((f f) x))))))) 何がなんだかわかりません こんなの読んでふむふむとかわかっちゃ…
部分関数と全関数の話その2 コラッツの関数と呼ばれるやつ 1なら終わり 偶数なら2で割る 奇数なら3を掛けて1を足す たったこれだけの関数なのに、必ず終わるかどうか、つまり全関数かどうかは証明されていません きっと全関数だろうとは思われてるみたい (d…
第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…
第8章「究極のlambda」の続きの続きの続き 数のリストから偶数だけを集めるevens-only*を作ります タップではなく木から集めてくるところがさっきまでとは違います これは普通の再帰だし問題ありません 次は収集子を使って、できあがりのリストと偶数の積と…
第8章「究極のlambda」の続きの続き Scheme手習いもそろそろ終盤 継続ってやつが出てきます 中ボスクラス Schemeはもともと継続を扱う機能を持っているんですが ここではlambdaを使って継続を手作りします たぶん原理的には同じもの では、これはどうでしょ…
第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…