Y コンビネータ(Combinator)を JavaScript で試す
SICP(計算機プログラムの構造と解釈)の 問題4.21 にある Y コンビネータ(Combinator)を JavaScript で実装してみる。 デモ:Y Combinator with JavaScript – SICP(計算機プログラムの構造と解釈) 問題4.21 Factorial Factorial のスクリプトコード (function (n) { return (fun…続きを読む
SICP(計算機プログラムの構造と解釈)の 問題4.21 にある Y コンビネータ(Combinator)を JavaScript で実装してみる。 デモ:Y Combinator with JavaScript – SICP(計算機プログラムの構造と解釈) 問題4.21 Factorial Factorial のスクリプトコード (function (n) { return (fun…続きを読む
問題4.21 λ式だけを使って再帰をしている問題のコードを見て、以前読んだYコンビネータの記事(Y Combinatorを直感的に理解。しようと試みる。 – 医者を志す妻を応援する夫の日記、Y コンビネータって何? – IT戦記)を思い出した。 脚注にはY演算子(Y operator)と書かれていて、何か関係があるのかと思ったら、Yコンビネータの日本語訳は "不動…続きを読む
問題4.20 a. letrec 式を導出された式として実装する letrec 式を let 式に変換する letrec->let 手続きを定義する (define (eval exp env) (cond ((self-evaluating? exp) exp) ;; 省略 ((letrec? exp) (eval (letrec->let exp) env)) ;; 省略 (else (…続きを読む
問題4.19 次の式を評価した際の結果について。 (let ((a 1)) (define (f x) (define b (+ a x)) (define a 5) (+ a b)) (f 10)) Ben の主張する define に逐次規則を使って結果を得る場合。 ;;; M-Eval input: (let ((a 1)) (define (f x) (define b (+ a x)) …続きを読む
問題4.18 どうも解らなかったので以下のサイトを参考にした。 参考:4.1.6 内部定義 – 三十路プログラマ (define (solve f y0 dt) (define y (integral (delay dy) y0 dt)) (define dy (stream-map f y)) y) ;; 最初の掃き出し方 (define solve (lambda (f y0 dt…続きを読む
問題4.17 フレームの生成を確認するために、手続き make-frame にリーダマクロを付けて読み出してみる。 (define (make-frame variables values) #?=(cons variables values)) 手続き scan-out-defines を使って、定義を逐次的に解釈した場合と内部定義を掃き出した場合とを比較する。 定義を逐次的に解釈した場合 ;;…続きを読む
問題4.16 a. lookup-variable-value に、値が *unassigned* の場合にエラーを返す処理を追加する。 (define (lookup-variable-value var env) (define (env-loop env) (define (scan vars vals) (cond ((null? vars) (env-loop (enclosing-en…続きを読む
問題4.15 (halts? p a) は任意の手続き p がオブジェクト a で停止するかどうかを判定する。 停止する場合は真を返し、停止しない場合は偽を返す。 (define (try p) (if (halts? p p) (run-forever) ‘halted)) 式 (try try) を評価すると、 (halts try try) が真(停止する)の場合、(try try) は停止…続きを読む
Lecture-7a: Metacircular Evaluator, Part 1 MIT での"超循環評価器"の講義動画。 問題4.14 Louis が基本手続きとして組み込んだ map では、第1引数の"手続き"に ‘procedure のタグが付いていないために手続きとして評価されないため。 計算機プログラムの構造と解釈 posted with am…続きを読む
問題4.13 束縛の除去は環境の最初のフレームだけでよい。 現在のフレーム以外の束縛も削除してしまうと、手続き中などのスコープ内の束縛も削除されてしまう。 束縛の削除はフレーム内で見つかった変数とその値の先頭リストの参照先を変更させて行う。 (define (eval exp env) (cond ((self-evaluating? exp) exp) ; 省略 ((unbind? exp) (…続きを読む