2014年9月22日月曜日

開発環境

計算機プログラムの構造と解釈[第2版](ハロルド エイブルソン (著)、ジュリー サスマン (著)、ジェラルド・ジェイ サスマン (著)、Harold Abelson (原著)、Julie Sussman (原著)、Gerald Jay Sussman (原著)、和田 英一 (翻訳)、翔泳社、原書: Structure and Interpretation of Computer Programs (MIT Electrical Engineering and Computer Science)(SICP))の4(超言語的抽象)、4.1(超循環評価器)、4.1.6(内部定義)、問題 4.20.を解いてみる。

その他参考書籍

問題 4.20.

コード(BBEdit, Emacs)

sample20.scm

#!/usr/bin/env gosh
;; -*- coding: utf-8 -*-

;; a.
(define (eval exp env)
  (cond ((self-evaluating? exp) exp)
        ;; 省略
        ((letrec? exp) (eval (letrec->let exp) env))
        ;; 省略
        (else
         (error "Unknown expression type -- EVAL" exp))))

(define (tagged-list? exp tag)
  (if (pair? exp)
      (eq? (car exp) tag)
      #f))

(define (letrec? exp) (tagged-list? exp 'letrec))
(define (letrec-clauses exp) (cdr exp))
(define (letrec-vars-exps clauses) (car clauses))
(define (letrec-vars seq)
  (if (null? seq)
      '()
      (cons (caar seq)
            (letrec-vars (cdr seq)))))
(define (letrec-exps seq)
  (if (null? seq)
      '()
      (cons (cadar seq)
            (letrec-exps (cdr seq)))))
(define (letrec-body clauses) (cdr body))

(define (letrec->let exp)
  (let ((clauses (letrec-clauses exp)))
    (let ((vars (letrec-vars clauses))
          (exps (letrec-exps clauses))
          (body (letrec-body clauses)))
      (cons 'let
        (cons (map (lambda (var)
                     (list var ''*unassigned*))
                   vars)
              (append (map (lambda (var exp)
                             (list 'set! var exp))
                           vars
                           exps)
                      body))))))

;; b.
;; letrecがletになった場合
(define (f x)
  (let ((even? (lambda (n)
                 (if (= n 0)
                     #t
                     (odd? (- n 1)))))
        (odd? (lambda (n)
                (if (= n 0)
                    #f
                    (even? (- n 1)))))))
  <手続きの本体>)
               
;; even?とodd?は再起的に評価することになり、エラーになる

0 コメント:

コメントを投稿