2014年1月2日木曜日

開発環境

計算機プログラムの構造と解釈(Gerald Jay Sussman(原著)、Julie Sussman(原著)、Harold Abelson(原著)、和田 英一(翻訳)、ピアソンエデュケーション、原書: Structure and Interpretation of Computer Programs (MIT Electrical Engineering and Computer Science)(SICP))の5(レジスタ計算機での計算)、5.5(翻訳系)、翻訳系の概観、5.5.6(文面アドレス)、問題 5.39.を解いてみる。

その他参考書籍

問題 5.39.

コード(BBEdit)

sample.scm

(define (lexical-address-lookup lexical-address compile-time-env)
  (let ((val (list-ref (list-ref compile-time-env
                                 (car lexical-address))
                       (cadr lexical-address))))
    (if (eq? val '*unassigned*)
        (error
         "Unassigned variable -- LEXICAL-ADDRESS-LOOKUP" lexical-address)
        val)))

(define (lexical-address-set! val lexical-address compile-time-env)
  (define (iter-frame frame-n var-n env)
    (cond ((null? env)
           (error
            "Unbound compile-time-env -- LEXICAL-ADDRESS-SET!"
            val lexical-address compile-time-env))
          ((= frame-n 0)
           (iter-variable var-n (car env)))
          (else (iter-frame (- frame-n 1) var-n (cdr env)))))
  (define (iter-variable var-n frame)
    (cond ((null? frame)
           (error
            "Unbound variable - LEXICAL-ADDRESS-SET!"
            val lexical-address compile-time-env))
          ((= var-n 0)
           (set-car! frame val))
          ((iter-variable val (- var-n (cdr frame))))))
  (iter-frame (car lexical-address)
              (cadr lexical-address)
              compile-time-env))

0 コメント:

コメントを投稿