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. 有错误直接说,谢谢