scheme简单求值器的分析

本文详细分析了一个MIT-Scheme下的Scheme简单求值器的实现,包括`eval`、`apply`及其相关过程的定义,环境管理和过程参数处理。通过对`eval`的条件结构和过程应用的解释,揭示了如何处理不同类型的表达式,如自求值、引用、赋值、定义、条件、序列等。同时,文章提到了环境模型、变量查找、过程定义以及基本过程的实现方式,探讨了如何将`cond`转换为`if`以及`begin`表达式的处理。最后,文章讨论了求值器与编译器的界限以及全局环境的初始化和驱动循环的工作方式。
摘要由CSDN通过智能技术生成

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))))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值