読者です 読者をやめる 読者になる 読者になる

kb84tkhrのブログ

何を書こうか考え中です

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…

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…

マインドフルネスと「ていねい」

最近は「マインドフルネス」ってやつが気になっていますそれでこういうのを読みました 世界のトップエリートが実戦する集中力の鍛え方 ハーバード、Google、Facebookが取りくむマインドフルネス入門 作者: 荻野淳也,木蔵シャフェ君子,吉田典生 出版社/メーカ…

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

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

Scheme手習い (1) 掟

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

愛用のメッセンジャーバッグを紹介かつ助けを求めたい

モノはこれです NORTH LEAF・メッセンジャーバッグba-546 たまたま行った先のバッグ屋でなにか予感がして見つけたものなんですが3000円という価格で即決衝動買いしました逸品というわけでもデザインが素晴らしいというわけでもないんですが自分の使い方にぴ…

階層の構造やタグの使い分けが落ち着いてくるまでのステップを書いてみる

WorkFlowyと言えば階層ですが 実を言うと階層構造はあまり好きではありませんでした 階層構造では項目をどこに入れてよいかわからなくなる、いわゆる「こうもり問題」のせいです たとえば友人という階層と仕事という階層とがあったとして 仕事でつながりので…

ちょっと落ち着いてきたのでWorkFlowyの運用を軽くまとめてみよう

WorkFlowyをだいたいのアウトライン構成が落ち着いてきたので運用をまとめてみますこれに従ってやってます、というよりいつの間にかこんな風になってました、という感じです WorkFlowyにどんなことを書くか はじめは思いつきを書いていただけですがこういう…

「Scheme手習い」という本

「Scheme手習い」というちょっと風変わりなプログラミング本があります どんな本? Structure and Interpretation of Computer Programs(SICP)という本がありますかなりメジャーなのでご存じの方も多いでしょう有用性だけでなく概念の難解さや練習問題のボリ…

とにかく書いてみよう、ということについて書いてみよう

11月も後半になって言うのもなんですが、今年はアウトプットを出す年にしようと思ってましたアウトプットというのはつまり何か文章を書くこと ブログ記事を読んでいると、深く考えて書いてるな、すごいな、と思うことがありますちょっとしたあこがれの気持ち…