問題4.20 – SICP(計算機プログラムの構造と解釈)その192
問題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.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…続きを読む
オブジェクトっぽい話が分かるかもしれないJavaScript講座 その1 | Takazudo Clipping* で JavaScript の prototype を使ってメソッドをつけるとメモリを食わなくていいとの話が出ていた。 さらに、そのサイトの参考先の Kristoffer’s tidbits : Javascript prototype versus closure exe…続きを読む
問題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) (…続きを読む
Firefox で DOM ノードを XML 文字列にして、Firebug のコンソールにダンプする。 var serializer = new XMLSerializer(); var elem = document.getElementsByTagName(‘H1’)[0]; console.log(serializer.serializeToString(elem)); 実行対象 … &…続きを読む