タグ

myとlispに関するkb84tkhrのブックマーク (8)

  • Scheme修行(15) 第20章 店には何がある?(続きの続き) - kb84tkhrのブログ

    lambdaは手習いのvalueにもありましたが、set!が出てきた関係で 複数の式を書けるようにする必要があります (define *lambda (lambda (e table) (lambda (args) (beglis (body-of e) (multi-extend (formals-of e) (box-all args) table))))) クロージャの作られ方が手習いの時とすこし違うかな? 手習いの時はこうでした (define *lambda (lambda (e table) (build (quote non-primitive) (cons table (cdr e))))) こちらは単純にテーブル・仮引数・関数体をリストにして記憶してますね 今回は関数(クロージャ)を作って返し、あとでその関数を評価するようにしています テーブル・仮引数・関数体はクロー

    Scheme修行(15) 第20章 店には何がある?(続きの続き) - kb84tkhrのブログ
  • Scheme修行(8) 第17章 我変わる、ゆえに我あり! - kb84tkhrのブログ

    ふたたび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 (atom? exists) (let ((result (D n))) (set! Rs (cons result Rs)) (set! Ns (cons n Ns)) result) exists)))))) これはメモ化が十分に働かない半バグバージョン これを何度か修正して、以下のような形にします (define deepM (let ((Rs (quo

    Scheme修行(8) 第17章 我変わる、ゆえに我あり! - kb84tkhrのブログ
  • Scheme修行(6) 第15章 大人と子供の違い・・・・・・ - kb84tkhrのブログ

    代入です set!はdefineされた変数に値を代入します と書くと先生に怒られるかもしれません 「名前xはaを参照しています」という言い方はここが初めてかな? こちらが正しい表現なんでしょう さっきまでaを参照していたxに、今度はbを参照させるというのがset!と いうことになります set!とdefine set!はすでにdefineされた名前についてのみ使用可能です 実際に、定義されてない名前をset!しようとするとエラーになります 逆に、define済みの名前でもう一度defineしようとするのもエラーかと思いきや成功 > (define x (cons (quote chicago) (cons (quote pizza) (quote ())))) > x '(chicago pizza) > (set! x (quote gone)) > x 'gone > (set! y

    Scheme修行(6) 第15章 大人と子供の違い・・・・・・ - kb84tkhrのブログ
  • Scheme手習い(24) eval、またはvalue、またはmeaning(5) - kb84tkhrのブログ

    普通のソースをdefineを使わないソースに変換する手法は 様々なシーンで役立つノウハウですのでまとめておきましょう(嘘 lambdaによる名前付け defineによる定義は、lambdaによる名前付けに書き換えることができます 修正前 (define A (lambda (a) (aaaaa))) (A aaa) 修正後 ((lambda (A) (A aaa)) ;Aの体 (lambda (a) (aaaaa))) 一律名前付けして使うより、適宜インライン展開して使った方がかえって見やすい場合も あるかもしれませんが今回は全て元のまま名前付けしました 複数の関数 複数の関数を同時に名前付けすることが可能です 適宜グループにして同一の階層で定義し、階層が深くなり過ぎないようにします ただし、互いに呼び出し関係にない場合に限ります 同時に定義すると、相手の関数がスコープにはいらないためで

    Scheme手習い(24) eval、またはvalue、またはmeaning(5) - kb84tkhrのブログ
  • Scheme手習い(14) 部分関数と全関数 - kb84tkhrのブログ

    第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 (pick sorn lat) lat)) (else (eq? a sorn))))) この関数、引数によっては無限ループに入ってしまい、実行が終わりません つまり関数が値を返しません 引数によっては関数が値を返さない関数を部分関数と言います これまで出てきた関数は、リストを扱うものであれば リストのcdr(や場合によってはcar)について再帰を行っていました そのため、再帰のたびにリストの長さが短くな

    Scheme手習い(14) 部分関数と全関数 - kb84tkhrのブログ
  • Scheme手習い (8) 表現と抽象化 - kb84tkhrのブログ

    的な再帰の練習は5章までで終わり 第6章「影法師」からは応用編といった感じ 6章では算術式を題材にして表現と抽象化を学びます 算術式をschemeで取り扱うためにS式で表したものを算術式の表現と呼びます まずは単純に、n + 3を(n + 3)と表現します ということは1 + 2 + 3の表現は(1 + 2 + 3)かと思ったらハズレ ここでは「2つの(数を含む)アトムか算術式を+か*か^で結合したもの」を算術式と呼んでます 算術式の定義に算術式が出てきますので再帰的定義ですね こういうのが後から出てくるのがこのの特徴 1 + 2 + 3は算術式1 + 2と算術式3を+で結合したものか、 または算術式1と算術式2 + 3を+で結合したものとみなせるので その表現は((1 + 2) + 3)か(1 + (2 + 3))のどちらかになります 右から結合とか左から結合とかは決まっていないよ

    Scheme手習い (8) 表現と抽象化 - kb84tkhrのブログ
  • Scheme手習い (2) 初めての再帰 - kb84tkhrのブログ

    第2章「一度、もう一度、さらにもう一度、またもう一度、……」ではラットの再帰を学びます ラット(lat)はこのだけの用語で、アトムだけが並んだリストのことです List of ATomsのことだと思われます 引数がラットであるかどうかを判定する関数lat?です (define lat? (lambda (l) (cond ((null? l) #t) ((atom? (car l)) (lat? (cdr l))) (else #f)))) この関数に引数として(bacon and eggs)を与えてやったときの動きを1行ずつ じっくりと追いかけていきます こんな感じです 一部略してます (lat? l)の最初の質問は何ですか。 (null? l)です。(略) 次のcond行 ( (null? l) #t) の意味は何ですか。 (null? l)は引数lがうリストかどうか質問します。(

    Scheme手習い (2) 初めての再帰 - kb84tkhrのブログ
  • Scheme手習い (1) 掟 - kb84tkhrのブログ

    Scheme手習いの復習を兼ねて、お勉強ログを焼き直しながら書いていきます 第1章「おもちゃ」ではアトム・リストの基礎を覚えます できることなら、読みながら例を試してほしい。 と書いてありますので実際に動かしながら進めましょう 以下のような問いを処理系で確かめるには lのcarは何ですか。引数lは次の通り。 (a b c) lのcarは何ですか。 ここで lは ((a b c) x y z) です。 以下のようにします > (define l '(a b c)) > (car l) a > (define l '((a b c) x y z)) > (car l) (a b c) lを2回defineしてますが、REPL上ではエラーになりませんでした 考えてみると不思議なことです 処理系に依存してるのかもしれません きちんとやるとすると、(このには出てきませんが)letを使ってこんな風に

    Scheme手習い (1) 掟 - kb84tkhrのブログ
  • 1