問題4.29 – SICP(計算機プログラムの構造と解釈)その203
問題4.29 メモ化しない force-it (define (force-it obj) (if (thunk? obj) (actual-value (thunk-exp obj) (thunk-env obj)) obj)) メモ化した force-it (define (force-it obj) (cond ((thunk? obj) (let ((result (actual-valu…続きを読む
問題4.29 メモ化しない force-it (define (force-it obj) (if (thunk? obj) (actual-value (thunk-exp obj) (thunk-env obj)) obj)) メモ化した force-it (define (force-it obj) (cond ((thunk? obj) (let ((result (actual-valu…続きを読む
問題4.28 演算子が手続きの場合に、演算子を強制する必要がある。 演算子の強制をする場合 ((application? exp) (apply (actual-value (operator exp) env) (operands exp) env)) ;;; L-Eval input: (define (foo x) (+ x 1)) ;;; L-Eval value: ok ;;; L-Ev…続きを読む
問題4.27 (define count 0) (define (id x) (set! count (+ count 1)) x) (define w (id (id 10))) 作用的順序の評価器の場合 w を定義した時点で手続き id が2つとも評価されるので (set! count (+ count 1)) が2回実行されて count の評価結果は 2 となる。 count gosh&g…続きを読む
遅延評価できるように修正された評価器のコード ;; 基盤の apply への参照を apply-in-underlying-scheme へ退避させる(こうすることで、基盤の apply に apply-in-underlying-scheme という名前でアクセスできる)。 (define apply-in-underlying-scheme apply) ;;;; apply の定義 (def…続きを読む
問題4.26 unless 式を if 式に変換する手続き unless->if を作り、導出された式として実装する。 ここでは4.1.7節の評価器に実装する。 (define (analyze exp) (cond ((self-evaluating? exp) (analyze-self-evaluating exp)) ;; 省略 ((unless? exp) (analyze (un…続きを読む
問題4.25 (define (unless condition usual-value exceptional-value) (if condition exceptional-value usual-value)) (define (factorial n) (unless (= n 1) (* n (factorial (- n 1))) 1)) 作用的順序の Scheme では定義された …続きを読む
問題4.24 手続き driver-loop の eval 部分を time で計測する。 (define (driver-loop) (prompt-for-input input-prompt) (let ((input (read))) (let ((output (time (eval input the-global-environment)))) (announce-output ou…続きを読む
問題4.23 4.1.7節の本文の版の analyze-sequence と Alysa の版の analyze-sequence の lambda 式部分にリーダーマクロを設置して実行してみる。 4.1.7節の本文の版の analyze-sequence (define (analyze-sequence exps) (define (sequentially proc1 proc2) #?=(…続きを読む
問題4.22 構文解析手続き analyze に let->combination を使った解析を追加する。 (define (analyze exp) (cond ((self-evaluating? exp) (analyze-self-evaluating exp)) … ((let? exp) (analyze (let->combination exp))) ((appl…続きを読む
以下は構文解析を実行から分離した新しい評価器の全コード (define apply-in-underlying-scheme apply) ;;;; eval の定義 (define (eval exp env) ((analyze exp) env)) ;;;; 構文解析手続き (define (analyze exp) (cond ((self-evaluating? exp) (analyz…続きを読む