タグ

ブックマーク / www.ice.nuie.nagoya-u.ac.jp/~h003149b (6)

  • Schemeでラムダ計算

    Schemeとか関数型言語を使う人は、ラムダ計算が好きだったりする。 実際にラムダ計算をするのは別に好きではないと思うけど。 日にも、 ラムダ算法騎士団の 総山 があったりする。 Schemeのlambdaでも実際のlambda計算みたいな事ができる。 ; *** car、cdr、cons *** ; car、cdr、consが、lambdaだけで書ける事は、わりと有名。 ; (car、cdr、consが書けるというのは、 ; (eq? x (car (cons x y))) ; (eq? y (cdr (cons x y))) ; が成立するという事。) ; 次のようになる。 (define _cons (lambda (x y) (lambda (z) (z x y)))) (define _car (lambda (z) (z (lambda (x y) x)))) (defin

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

    不動点オペレータ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))

  • Haskellの入出力

    参照透過性と遅延評価 純粋遅延関数型言語に入出力を導入する場合には、 参照透過性や遅延評価とどう折り合いをつけるか、 が問題になる。 参照透過性(Referential Transparency) 「参照透過性」の正確な定義は知らない。 けれど、だいたい 「等しいものを別の等しいものに置き換えられて、 置き換えての全体の結果が変わらない」 という性質を「参照透過性」と呼ぶ。 (「代入可能性の原理」とどう違うのかは、よく判らない) なんでこの性質を参照透過性と呼ぶのかも正確な所は判らないけど、 たぶん次のような事が元になっているのでは、と予想している (以下しばらく、題(入出力の話)とは関係ない)。 クワインは「指示と様相」(「論理的観点から」に収録)で、 だいたい次のような事を書いている。 名前(とか項とか)が単に対象を指示するものとして現れている場合を 「純粋に指示的(purely r

  • 継続の説明(前置き)

    継続の説明の断片 「John Reynolds "The Discoveries of Continuations" によると、 継続の概念が初めて現れるのは1964年らしい。 そして、1970、1971年頃(さらにその後も)何人もの人によって再発見されている。 Knuth は、何人もの人が独立に演算子順位文法を考えだしたのに 自分は思いつかなかったから、 「自分は、自力で演算子順位文法を思いつけなかった唯一の計算機科学者だ」 とか考えたらしい。 「自分は、自力で継続を思いつけなかった唯一の計算機科学者だ」 と考えた人もいるのだろうか。」 C言語のexit() 関数は、関数呼び出しと言うよりジャンプだ、 という事を聞くことがある。 なぜかというとexit() は関数呼び出しから戻ってこないから。 例えば、 exit(1); printf("Not reached\n"); となっている時、

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

    プログラミングそのものは、あまり好きではない。 当然、実用的な内容はない。 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

  • 継続の使用法

    「継続の書(Book of Continuation): 8面以降でもコンティニューできるようになる」 (「レインボーアイランド」) Schemeには継続を扱うための関数 call-with-current-continuation (別名 call/cc) がある。 でもここでは blockという(機能としては違いの無い)構文を定義して、 それを使って説明していく。 blockの定義は、 (define-syntax block (syntax-rules () ((_ name e1 e2 ...) (call-with-current-continuation (lambda (name) e1 e2 ...))))) とか、 (define-macro (block name . body) `(call-with-current-continuation (lambda (,n

  • 1