kb84tkhrのブログ

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

littleschemer

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…

Scheme手習い(10) 高階関数とカリー化

第8章「究極のlambda」では高階関数を学びます まずは一番わかりやすい、引数として関数を渡すパターン いつものremberで、比較のための関数を指定できるようにします (define rember-f (lambda (test? a l) (cond ((null? l) (quote ())) ((test? (car l) a…

Scheme手習い(9) 集合と関数

第7章「友達と親類」では集合と関数を題材に取ります プログラミング的にはあまり新しい話はない気がするので何を書いたらいいものやら 作者の狙いは何 ここまでで覚えた書き方で数学の概念がこんな風に表現できますよ、みたいな感じ? 私はそういう話好きだ…

Scheme手習い (8) 表現と抽象化

基本的な再帰の練習は5章までで終わり 第6章「影法師」からは応用編といった感じ 6章では算術式を題材にして表現と抽象化を学びます 算術式をschemeで取り扱うためにS式で表したものを算術式の表現と呼びます まずは単純に、n + 3を(n + 3)と表現します とい…

Scheme手習い (7) 一般のリストの再帰(続き)

第5章「*すごい*星がいっぱいだ」の続きです 指定したアトムが木に現れる回数を数えるoccur*、指定したアトムを置き換えるsubst*、 指定したアトムの左にアトムを挿入するinsertL*を作ります 前回みっちり考えたのでここらへんは楽勝 数を作ったりリストを作…

Scheme手習い (6) 一般のリストの再帰

第5章「*すごい*星がいっぱいだ」では一般のリストに対する再帰を練習しますちょっと苦手なんです 一般のリストってなんでしょう? ラットやタップと異なり、リストの要素にリストを含むようなもののことを言ってます S式のリストと書いてるところもあります…

Scheme手習い (5) 数のリスト

次は数のリストを扱います 数のリストはタップ(tup)と呼ばれています 扱い方はラットとほとんど同じ タップに含まれる数の合計を返すaddtup (define addtup (lambda (tup) (cond ((null? tup) 0) (else (o+ (car tup) (addtup (cdr tup))))))) ()の代わりに0…

Scheme手習い (4) 計算

第4章「数あそび」では四則演算や比較などを定義しつつ数や数のリストの使い方を学びます この本で使うSchemeは非常に限定されていて、なんと足し算や引き算も比較もできません 数に関してできるのは1を足す(add1)、1を引く(sub1)、0かどうかを調べる(zero?)…

Scheme手習い (3) リスト作り

第3章「偉大なるCons」では再帰しながらconsを使ってリストを作ることを学びます リストから指定した要素を取り除く、rember という関数を題材にします 最初は間違った定義を与えられちゃったりします (define rember (lambda (a lat) (cond ((null? lat) (q…

Scheme手習い (2) 初めての再帰

第2章「一度、もう一度、さらにもう一度、またもう一度、……」ではラットの再帰を学びます ラット(lat)はこの本だけの用語で、アトムだけが並んだリストのことです List of ATomsのことだと思われます 引数がラットであるかどうかを判定する関数lat?です (def…

Scheme手習い (1) 掟

Scheme手習いの復習を兼ねて、お勉強ログを焼き直しながら書いていきます 第1章「おもちゃ」ではアトム・リストの基礎を覚えます できることなら、読みながら例を試してほしい。 と書いてありますので実際に動かしながら進めましょう 以下のような問いを処理…

「Scheme手習い」という本

「Scheme手習い」というちょっと風変わりなプログラミング本があります Scheme手習い 作者: Daniel P. Friedman,Matthias Felleisen,元吉文男,横山晶一 出版社/メーカー: オーム社 発売日: 2010/10/22 メディア: 単行本(ソフトカバー) 購入: 5人 クリック:…