0
点赞
收藏
分享

微信扫一扫

1169_SICP学习笔记_数据意味着什么

梅梅的时光 2022-03-12 阅读 79


    全部学习汇总: ​​GitHub - GreyZhang/g_SICP: learn SICP and hack lisp.​​

1169_SICP学习笔记_数据意味着什么_lisp

    顺着这个描述,用我们自己的话来描述什么数data其实也是容易的。data,数据,其实是一种关系的表达方式。

1169_SICP学习笔记_数据意味着什么_lisp_02

    前面的例子之中,使用了cons、car以及cdr来实现数据的抽象表达。这个只是因为这三个正好是lisp的基础操作。其实,不使用这3个操作直接使用函数夜可能够定义出来类似的实现形式。

    上面的代码是对cons、car以及cdr的一个实现。的确是十分巧妙,cons实现的是一个返回函数的函数,但是返回的这个函数其实是绑定了x和y两个数据。而这个函数的功能则是根据输入的数字来提取绑定的数据元素。这样,car以及cdr的实现也是很容易理解的了。

1169_SICP学习笔记_数据意味着什么_开发语言_03

    如果只是使用cons、car以及cdr操作,我们定义出来的这三个函数其实是跟真实的数据效果一样的。但是这并不是lisp实现cons、car以及cdr的方法。lisp中为了考虑效率因素,直接实现了cons的功能。

1169_SICP学习笔记_数据意味着什么_lisp_04

    这是有一种cons以及car的实现,理解起来又花了我几分钟时间。但是,理解起来也不是很难。

    首先看一下cons,cons返回的是一个绑定了数据x和y函数,这个函数会调用一个传入的函数,并把x和y传递给传入函数。

    接下来,看一下car的实现。这个首先接收cons定义出来的函数,然后调用这个函数传进去一个新的函数,由于前面的cons设计,传入进去的新函数会获取到cons中lambda实现的函数所绑定的两个数据。这样,p和q分别就获取到了x以及y的数值。

    基于这样的分析,cdr的实现也容易了,接下来做一个测试。代码实现如下:

(define (cons x y)

  (lambda (m) (m x y)))

(define (car z)

  (z (lambda (p q) p)))

(define (cdr z)

  (z (lambda (p q) q)))

    测试结果如下:

1169_SICP学习笔记_数据意味着什么_c#_05

    看着书籍中另一个练习的内容是关于lambda的一个发明相关的练习,看了一阵子没有怎么理解。我没有做出来对应的习题,看了网络上别人的答案,理解不深但是深感神奇!


举报

相关推荐

0 条评论