2014.9.29 天气”“”不知道怎么形容,就当晴天把
代码在mit-scheme下编译通过并完成功能测试,基本没有错误吧,
代码有点乱,编译的时候调整了原来的代码顺序,不知道为什么,这个编译器有时候可以不用考虑代码顺序,有时候要考虑,可能是编译器自身的实现问题。调试的时候忽略了,现在来看, 还是不明白,过程定义为什么有时候要顺序定义有时候不需要?(问题) 编译器对文本的解释是把所有过程定义全都看一遍(像广度搜索一样)还是在定义一个过程是环境里必须已经有了所有需要的过程(像广度搜索一样)?又或者是只对某些特定的基本过程中的调用过程必须要在环境中有定义? if的predicate是必须强制的吗?...........................刚才试了一下还像不是。哎,先不管了。下面是求值器代码。
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;other Codes
(define (length items)
(if (null? items)
0
(+ 1 (length (cdr items)))))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;求值器的内核部分
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; eval 的定义
(define (eval exp env)
(cond ((self-evaluation? exp) exp)
((variable? exp) (lookup-variable-value exp env))
((quoted? exp) (text-of-quotation exp))
((assignment? exp) (eval-assignment exp env))
((definition? exp) (eval-definition exp env))
((if? exp) (eval-if exp env))
((lambda? exp)
(make-procedure (lambda-parameters exp)
(lambda-body exp)
env))
((begin? exp)
(eval-sequence (begin-actions exp) env))
((cond? exp) (eval (cond->if exp) env))
((application? exp)
(my-apply (eval (operator exp) env)
(list-of-values (operands exp) env)))
(else
(error "Unknown expression type--EVAL" exp))))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; apply 定义
(define (my-apply procedure arguments)
(cond ((primitive-procedure? procedure)
(apply-primitive-procedure procedure arguments))
((compound-procedure? procedure)
(eval-sequence
(procedure-body procedure)
(extend-environment
(procedure-parameters procedure)
arguments
(procedure-environment procedure))))
(else
(error
"Unknown procedure type -- APPLY" procedure))))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 过程参数 定义
(define (list-of-values exps env)
(if (no-operands? exps)
()
(cons (eval (first-operand exps) env)
(list-of-values (rest-operands exps) env))))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 条件
(define (eval-if exp env)
(if (true? (eval (if-predicate exp) env))
(eval (if-consequent exp) env)
(eval (if-alternative exp) env)))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 序列
(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))))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;