`

计算机程序的构造和解释

 
阅读更多

 

 

 

创建一个有理数

(define (make-rat n d) (cons n d))      #定义一个分数

(define (number x) (car x))                 #number获取一个分数的分子部分

(define (denom x) (cdr x))                  #denom获取一个分数的分母部分

 

打印有理数

(define (print x)

(newline)                           #内置的基本过程,打印新的一行

(display (number x))        #打印分子部分

(display "/")                       #打印 /

(display (denom x))         #打印分母部分

 

#定义一个分数

(define one-half (make-rat 1 2))

one-half

(1 . 2)

(print one-half)                 #打印分数

 

1/2

 

 

 

可以执行加减乘除运算的 解释器

#lang racket
(define (calc exp)
   (match exp                                ; 匹配表达式的两种情况
     ((? number? x) x)                       ; 是数字,直接返回
     (`(,op ,e1 ,e2)                         ; 匹配并且提取出操作符 op 和两个操作数 e1, e2
      (let ((v1 (calc e1))                   ; 递归调用 calc 自己,得到 e1 的值
            (v2 (calc e2)))                  ; 递归调用 calc 自己,得到 e2 的值
        (match op                            ; 分支:处理操作符 op 的 4 种情况
          (`+ (+ v1 v2))                     ; 如果是加号,输出结果为 (+ v1 v2)
          (`- (- v1 v2))                     ; 如果是减号,乘号,除号,相似的处理
          (`* (* v1 v2))
          (`/ (/ v1 v2)))
        );end let
      );end (`(,op,e1,e2)
     );end match
  );end define

( calc '(+ ( + 1 2)  ( + 3 4)) )

 

定义了calc这个函数,同时也使用到了模式匹配的功能

`(op,e1,e2) 表示当前的数据结构中有三个元素,所以匹配(op,e1,e2)这三个元素

let是赋值并执行一段内容

(let (v1 值) (v2 值) (....)  (body 执行一段内容) )

这段的作用是如果匹配的是数字就返回,否则递归的求e1和e2的值,当求解完后将他们分别赋给e1和e2

最后还有一个match用于匹配op的,匹配到 加减乘法再做对应的运算 

 

 

 

#lang racket
(define env0 '())

;; 扩展。对环境 env 进行扩展,把 x 映射到 v,得到一个新的环境
(define ext-env
 (lambda (x v env)
   (cons (cons x v) env)))

;; 查找。在环境中 env 中查找 x 的值
(define lookup
            (lambda (x env)
            (let ([p (assq x env)])
               (cond
                  [(not p) x]
                    [else (cdr p)]))))

;; 闭包的数据结构定义,包含一个函数定义 f 和它定义时所在的环境
(struct Closure (f env))

;; 解释器的递归定义(接受两个参数,表达式 exp 和环境 env)
;; 共 5 种情况(变量,函数,调用,数字,算术表达式)
(define interp1
 (lambda (exp env)
   (match exp                                          ; 模式匹配 exp 的以下情况(分支)
     [(? symbol? x) (lookup x env)]                    ; 变量
     [(? number? x) x]                                 ; 数字
     [`(lambda (,x) ,e)                                ; 函数
      (Closure exp env)]
     [`(,e1 ,e2)                                       ; 调用
      (let ([v1 (interp1 e1 env)]
            [v2 (interp1 e2 env)])
        (match v1
          [(Closure `(lambda (,x) ,e) env1)
           (interp1 e (ext-env x v2 env1))]))]
     [`(,op ,e1 ,e2)                                   ; 算术表达式
      (let ([v1 (interp1 e1 env)]
            [v2 (interp1 e2 env)])
        (match op
          [‘+ (+ v1 v2)]
          [‘- (- v1 v2)]
          [‘* (* v1 v2)]
          [‘/ (/ v1 v2)]))])))


(define (interp exp)
  (interp1 exp env0)
)

(interp '(((lambda (x) (lambda (y) (* x y))) 2) 3)) 

下面表达式的计算过程

(interp '( (lambda(xx) (+ 1 xx)) 10 ) )

 

调用到match中的判断

(`(,e1 ,e2) 

这里的e1是  (lambda (xx) (+ 1 xx))

e2是  10

 

(`(,e1 ,e2))中的递归计算

[v1 (interp1 e1 env)]

[v2 (interp1 e2 env)]

 

其中 [v1 (interp1 e1 env)]

会调用到match中的判断

(`(lambda (,x) ,e) 

这里的x是 lambda函数的参数xx

e 是函数内的表达式 (+ 1 xx)

 

之后 [v2 (interp1 e2 env)]

会调用到

[(? number? x) x] 

 

之后执行到mathc v1

        (match v1

          [(Closure `(lambda (,x) ,e) env1)

           (interp1 e (ext-env x v2 env1))])

 

(interp1 e (ext-env x v2 env1))

这段的作用是计算表达式

e的值是    (+ 1 xx)

x的值是    函数的参数xx

v2的值是   10

env1的值是 ()    

(ext-env x v2 env1)

这段的作用是将

lambda的参数x(传入的参数名叫xx),还有值v2(内容是10)加入到env1环境中

此时env1是() 空的,所以执行完后env1就是(xx 10)

(+ 1 xx) ext-env最后匹配到 [`(,op ,e1 ,e2)

op是+

e1是 1

e2是xx,然后匹配到表达式 [(? symbol? x) (lookup x env)]

返回xx的值也就是10

最后计算表达式(+ 1 10) 结果为11

 

------------------------------------------------------------------------------------------------------------

 

下面表达式的计算过程

(interp '(((lambda (x) (lambda (y) (* x y))) 2) 3))

 

首先[`(,e1 ,e2)被匹配上

(let ([v1 (interp1 e1 env)]

递归执行这里的e1是

((lambda (x) (lambda (y) (* x y))) 2)

 

[v2 (interp1 e2 env)]

这里的e2是数字 3

然后匹配到 [(? number? x) x] 直接返回数字3

 

 

[v1 (interp1 e1 env)会递归调用解释器函数,最后匹配到这里

['(lambda (,x) ,e)

  (Closure exp env)]

Closure中的的exp为

    '(lambda (x) (lambda (y) (* x y)))

env为 '()

 

match匹配v1然后

(interp1 e (ext-env x v2 env1))

这里的 e是

    (lambda (y) (* x y))

x是lambda(y)中的参数y,这个表达式相当于

(interp1 '(lambda(y) (* x y)) ext-env)

这里的ext-env相当于 (x 2)

 

于是 (interp1 '(lambda(y) (* x y)) ext-env)

会继续递归,调用到[`(,e1 ,e2)

最后变成 (interp1 (* x y) ext-env)

这里的ext-env是((y 2) (x 3))

 

 

最后执行到 [`(,op ,e1 ,e2) 

这里的op 是*

e1 是 x

e2 是 y

x和y是变量,也就是匹配到表达式

[(? symbol? x) (lookup x env)] 

调用lookup函数查找key对应的value,结果x就是3,y就是2

而op匹配到 *,执行 (* 3 2)结果就是6 

 

 

 

 

 

schema官方列表

kawa官方文档

Racket官方文档

SCIP公开课翻译项目

麻省理工SCIP公开课主页

 

 

分享到:
评论

相关推荐

    北京大学,计算机程序构造和解释(SICP)课件,裘宗燕老师主讲

    《计算机程序构造和解释》(SICP,Structure and Interpretation of Computer Programs)是一本具有深远影响力的计算机科学教材,由Harold Abelson和Gerald Jay Sussman编写,MIT Press出版。这门课程由北京大学数学...

    计算机程序的构造和解释教程+pdf+英文版

    计算机程序的构造和解释教程+pdf+英文版

    计算机程序构造与解释 python中文版 mobi

    计算机语言构造与解释 python语言中文版 mobi格式;结合python读起来比原来的lisp描述更容易实际操作

    计算机程序的解释与构造

    数据结构和算法是计算机程序设计的基础,本书通过实例讲解了各种数据结构(如列表、树、图等)及其在算法中的应用。同时,书中也介绍了算法分析的基本方法,帮助读者学会评估算法的效率。 #### 4. 计算机系统的模型...

    计算机程序构造与解释

    《计算机程序构造与解释》是麻省理工学院(MIT)的经典教材,对于深入理解计算机程序设计原理具有极高的价值。本书旨在帮助学习者不仅掌握编程技术,还理解程序设计的本质和计算机系统的内在工作原理。书中的内容...

    计算机程序的构造与解释

    压缩包中的两份PDF文件——《计算机程序的构造和解释(SICP中文第2版).pdf》和《sicp-py.pdf》,分别提供了原版中文翻译和Python解释的SICP内容,为读者提供了方便的阅读材料。不论你是初涉编程的新手,还是经验...

    <计算机程序的构造和解释>第二版中文参考答案

    ### 计算机程序的构造和解释:第二版中文参考答案解析 #### 一、章节概览 本书《计算机程序的构造和解释》第二版旨在深入探讨计算机程序的设计原理及其背后的逻辑思考方式。第一章作为开篇,介绍了Scheme语言的...

    计算机程序构造和计算

    本书在电气工程和计算机科学教育中占有举足轻重的地位,其内容深入浅出地介绍了计算机程序设计的基本原理和高级概念,尤其侧重于程序的结构和解释。 ### 计算机程序构造 #### 1. 程序设计的核心理念 《计算机程序...

    计算机程序的构造与解释(Structure.and.Interpretation.of.Computer.Programs)中英版

    《计算机程序的构造与解释》(Structure and Interpretation of Computer Programs,简称SICP)是一本经典的计算机科学教材,由Harold Abelson和Gerald Jay Sussman合著,MIT出版社出版。这本书深入探讨了程序设计的...

    计算机程序设计与解释 chm及pdf两本

    书中以Lisp语言作为教学工具,Lisp以其简洁的语法和强大的函数式编程特性,能够帮助读者深入理解程序的结构和解释过程。 SICP主要包含以下几个关键知识点: 1. **函数式编程**:书中介绍了函数式编程的基本概念,...

    [计算机程序的构造和解释].(中文版).清晰版

    声明:本版权归原著者所有,请勿用于商业用途!仅供参考!

    SICP 计算机程序的构造与解释

    SICP的核心主题是程序构造和解释,它不仅关注如何编写程序,更注重如何思考和设计复杂的系统。书中通过一系列逐步递进的练习和案例,引导读者掌握函数式编程思想,特别是Scheme语言的特性,如高阶函数、闭包、递归...

    reading-sicp:《计算机程序的构造和解释》(SICP) 解题集

    书籍使用《计算机程序的构造和解释》。在线英文版,排版更好的英文版。 使用 开发环境,来测试编写 Scheme 代码。 我最初设想使用 Lua 完成书中代码和习题。Lua 和 Scheme 有点相似,而我也更熟悉 Lua 语言。 第 1 ...

    CCF中学生计算机程序设计套装.pptx

    《CCF中学生计算机程序设计套装》是一本为中学生量身定制的计算机程序设计教材,由CCF(中国计算机学会),旨在推广计算机编程教育,培养中学生的编程素养和思维能力。本书的内容包括编程基础知识、编程语言和编程...

    《计算机程序的构造和解释一书》的课后习题答案.zip

    《计算机程序的构造和解释一书》的课后习题答案.zip

    R语言版本的计算机程序的构造和解释_sicp_in_r.zip

    R语言版本的计算机程序的构造和解释_sicp_in_r

    计算机程序设计艺术

    第一卷《基本算法》(第3版)详细介绍了程序设计的基础,包括数据表示、计算过程、程序结构和控制流等核心概念。Knuth以其严谨的数学分析和丰富的编程经验,阐述了如何构建高效、可靠的算法,为后续的深入学习打下...

Global site tag (gtag.js) - Google Analytics