開発環境
- OS X Lion - Apple(OS)
- Emacs、BBEdit - Bare Bones Software, Inc. (Text Editor)
- プログラミング言語: MIT/GNU Scheme
計算機プログラムの構造と解釈(Gerald Jay Sussman(原著)、Julie Sussman(原著)、Harold Abelson(原著)、和田 英一(翻訳)、ピアソンエデュケーション、原書: Structure and Interpretation of Computer Programs (MIT Electrical Engineering and Computer Science)(SICP))の4(超言語的抽象)、4.1(超循環評価器)、4.1.2(式の表現)、問題 4.3を解いてみる。
その他参考書籍
問題 4.3
コード(BBEdit)
sample.scm
(define (eval exp env)
(define (self-evaluating? exp)
(cond ((number? exp) true)
((string? exp) true)
(else false)))
(define (variable exp)
(symbol? exp))
(define (application? exp)
(pair? exp))
(cond ((self-evaluating? exp) exp)
((variable? exp) (lookup-variable-value exp env))
(((get 'eval (operator exp)))
(get 'eval (operator exp) (operands exp) env))
((application? exp)
(apply (eval (operator exp) env)
(list-of-values (operands exp) env)))
(else
(error "Unknown expression type -- EVAL" exp))))
(define (install-quoted-package)
(define (inner-eval exp env)
(text-of-quotation exp))
(define (text-of-quotation exp)
(cadr exp))
(put 'eval 'quoted inner-eval)
'done)
(define (install-assignment-package)
(define (eval-assignment exp env)
(set-variable-value! (assignment-variable exp)
(eval (assignment-value exp) env)
env)
'ok)
(define (assignment-variable exp) (cadr exp))
(define (assignment-value exp) (caddr exp))
(put 'eval 'set! eval-assignment)
'done)
(define (install-definition-package)
(define (eval-definition exp env)
(define-variable! (definition-variable exp)
(eval (definition-value exp) env)
env)
'ok)
(define (definition-variable exp)
(if (symbol? (cadr exp))
(cadr exp)
(caadr exp)))
(define (definition-value exp)
(if (symbol? (cadr exp))
(caddr exp)
(make-lambda (cdadr exp)
(cddr exp))))
(define (make-lambda parameters body)
(cons 'lambda (cons parameters body)))
(put 'eval 'define eval-definition)
'done)
(define (install-if-packge)
(define (eval-if exp env)
(if (true? (eval (if-preicate exp) env))
(eval (if-consequent exp) env)
(eval (if-alternative exp) env)))
(define (if-predicate exp) (cadr exp))
(define (if-consequent exp) (caddr exp))
(define (if-alternative exp)
(if (not (null? (cdddr exp)))
(cadddr exp)
'false))
(put 'eval 'if eval-if)
'done)
(define (install-lambda-package)
(define (make-procedure (lambda-parameters exp)
(lambda-body exp)
env))
(define (lambda-parameters exp) (cadr exp))
(define (lambda-body exp) (cddr exp))
(put 'eval 'lambda make-procedure)
'done)
(define (install-begin-package)
(define (eval-sequence exps env)
(cond ((last-exp? exps) (eval (first-exp exps) env))
(else (eval (first-exp exps) env)
(eval-sequence (rest-exps exps) env))))
(define (last-exp? exps) (null? (cdr seq)))
(define (first-exp exps) (car seq))
(define (rest-exps exps) (cdr seq))
(put 'eval 'begin eval-sequence)
'done)
(define (install-cond-package)
(define (cond->if exp)
(expand-clauses (cond-clauses exp)))
(define (expand-clauses clauses)
(if (null? clauses)
'false
(let ((first (car clauses))
(rest (cdr clauses)))
(if (cond-else-clause? first)
(if (null? rest)
(sequence->exp (cond-actions first))
(error "ELSE clause isn't last -- COND->IF"
clauses))
(make-if (cond-predicate first)
(sequence->exp (cond-actions first))
(expand-clauses rest))))))
(define (cond-else-clause? clause)
(eq? (cond-predicate clause) 'else))
(define (sequence-exp seq)
(cond ((null? seq) seq)
((last-exp? seq) (first-exp seq))
(else (make-bvegin seq))))
(define (make-if predicate consequent alternative)
(list 'if predicate consequent alternative))
(define (cond-actions clause) (cdr clause))
(define (cond-predicate clause) (car clause))
(define (last-exp? seq) (null? (cdr seq)))
(define (first-exp seq) (car seq))
(define (make-begin seq) (cons 'begin seq))
(put 'eval 'cond (lambda (exp env)
(eval (cond->if exp) env)))
'done)
なんか長くなった。
0 コメント:
コメントを投稿