タグ

2009年11月26日のブックマーク (6件)

  • 11. 継続 | Schemeへの道

    継続(continuation)とは,式を評価している途中のある時点で,『いま得られた 値を使って,この後は何を計算するのか』を表すものである.たとえば,Scheme の関数呼びだしの式を評価する際には,まず関数とその引数を評価して,その 後で関数に引数を適用する. ==> (+ (* 1 2) (* 3 4)) ;; ==> (+ 2 12) ;; ==> 14 14 この式の場合,まず「+」,「(* 1 2)」,「(* 3 4)」を評 価したのち,「(+ 2 12)」を評価する. 各部分式の評価が左から右へ進むものとすると, たとえば,「(* 3 4)」を評価した後にするべき計算,つまり継続は, 『いま得られた値に2を加える』 である.この式の評価を完了するためには, Schemeのシステムは,この継続を知っていなければならない. 継続は,「何を評価して,その値によって次には何を行う」

  • 10. i クロージャとオブジェクト | Schemeへの道

    関数体の定義とそれを評価するための環境を合わせてクロージャと呼ぶ. クロージャの概念を用いれば,オブジェクト指向プログラミングの基要素であるオブジェクトを作成することができる. オブジェクトとは,簡単に言えば,メンバ変数(フィールド)といわれるデータとそれを操作するためのメンバ関数(メソッド)をまとめた部品のようなものである. 各フィールドのスコープはオブジェクト内に局所化され,それらにアクセスするためには必ずメソッドを用いることになる. つまりオブジェクト内部のデータは予め指定された方法でのみ操作され,プログラムの他の部分から予期せぬ形で影響を受けることがない. こうすることによって,オブジェクトの内部構造がブラックボックス化され,オブジェクトを,ある機能を提供するプログラムの抽象的な部品として,その詳細な実現方法に左右されることなく利用することができるようになる. ここでは環境モデ

  • 10. 評価環境のモデル | Schemeへの道

    変数(関数)は,フレームの列からなる環境モデルによって管理されている. フレームとは,変数(もちろんlambda式によって記述される関数も含む)の集まりを格納する入れ物(テーブル)である. またフレームは,それを含む上位の環境(フレームの列)を指し示すポインタを持つ. つまり,あるフレームは別のフレームを指し,さらにそのフレームがまた別のフレームを指すというようにして,フレームの列が形成され,これが環境を定義する. 変数の値は環境を下位のフレームから上位のフレームへと順次調べることで評価される. この図で太い矢印がフレーム同士の関係を与えている.frame1は最上位のフレームであり上位のフレームを持たない. 上述の通り,環境は(矢印でつながれた)フレームの列で構成される. 例えば環境env4は,frame4,frame2,frame1の3つのフレームの列から構成されている. この環境env

  • プログラム言語とその他のメモ。

    プログラミングそのものは、あまり好きではない。 当然、実用的な内容はない。 2005年4月以降どうなるか不明。 Lispの(S式以外の)特徴(未完成) Scheme、Common Lisp、Emacs Lispの比較(未完成) 内容のわりに長い。 自己出力プログラムと自己参照プログラム 計算できない問題・関数について 停止問題とかbusy beaver関数の事など。 Schemeでラムダ計算 不動点オペレータについて 再帰的定義に使うYオペレータとかの事。 継続の説明(前置き) 継続の使用法 Schemeでの継続の使用。 SchemeとActor理論 CPS(Continuation Passing Style)について 「SchemeとActor理論」と同じ内容なので、 どうするか考え中。 CPSで多値(とか) values、call-with-valuesがあるから、 無理してS

  • 不動点オペレータについて

    不動点オペレータY 階乗関数は、 (define fact (lambda (n) (if (= n 0) 1 (* n (fact (- n 1)))))) のように、再帰的に定義できる。 再帰的定義を行なう場合はdefineやletrecを使うけど、 代わりにletを使うと再帰的定義はできない。 defineやletrecをどうしても使いたくないなら、多少工夫がいる。 例えば、factの引数を増やすという方法がある。 (let ((fact (lambda (self n) (if (= n 0) 1 (* n (self self (- n 1))))))) (fact fact 10)) ⇒ 3628800 (中略) 不動点オペレータYを使うと次のように書ける。 (let* ((Y (lambda (g) ((lambda (s) (g (lambda (x) ((s s) x))

  • Yコンビネータを読み解こう - ボクノス

    Y コンビネータって何? - IT戦記で話題になってるYコンビネータがイマイチわからない。 良記事発見したので、Y CombinatorのYコンビネータを読み解いて行きたいと思います。英語版も必見デス。 相当長いです。 Yコンビネータとはナニモノ!? そういや、再帰って、名前が無いと再帰出来ないのかなぁ・・・全ての式がλで書けるなら、再帰関数もλで書けるはずだ。名前イラナイ!!という時、困っちゃうのが再帰関数の定義。僕の少ない頭では定義出来ませんでした。 「再帰をλで書きたい」 と、思ったときに登場するのが「Yコンビネータ」らしい。追っていく。 階乗ってなんだっけ まずは復習。とりあえず階乗を書きます。 (define (fact n) (if (zero? n) 1 (* n (fact (- n 1))))) (fact 10) ; 3628800 式をを分解すると、 (* 10 (*

    Yコンビネータを読み解こう - ボクノス