Hi, I’m Lin.

I write program.

SICP小随笔1

最近在看SICP,做里面的练习。总感觉要写点什么,不过笔记这种东西我好像写不来。 就随便写写关于scheme自己当前的想法。

没有顺序执行

比如我要自己实现一个for-each(功能是对一个列表中每个元素执行同一个函数,不需要返回值)
按照一般情况下的逻辑,我要这样子写代码

;如果scheme允许顺序执行的话
;当然不允许,下面是错误的语法

(define (for-each proc x)
  (if (not (null? x))
      ((proc (car x)) ; 在这里先用proc执行第一个元素
       (for-each proc (cdr x))))) ; 剩余的用for-each继续递归

这里的两步是没有关系的,理论上也是扯不上关系。
但是lisp什么的就是不让你一下子顺序执行两个过程,所以要把两个合成一个就好了。
要让一个函数执行但是不使用它的结果,结论就是把只是执行的那个函数的结果作为第二个函数的参数。
因为在调用函数的时候参数的如果不是最后结果是一定会被执行的。
然后就是代码

(define (for-each proc x)
  (define (iter x nouse)  ; 定义迭代函数含有第三个参数,作为参数但是不使用
      (if (not (null? x))
            (iter (cdr x) (proc (car x)))))
    (iter x nil))

很简单的语法,但是写Lisp的时候感觉和C,Python什么的完全不一样。
全都是递归,没有很直白的东西,但是看懂会有豁然开朗的感觉。

过程和数据的抽象

在学面向对象的时候,就是关于封装底层只是操作对象,这样能获得更清晰的操作。
但是之前接触到的时候函数就是函数,数据就是数据。
一个函数返回另一个函数是不可想象的,当然就算是C也是可以做到的。 但是Lisp在这种操作下面是很常用的。或者说是每个语言的编程习惯?

PS. 有错误直接说,谢谢