全部学习汇总:GitHub - GreyZhang/g_SICP: learn SICP and hack lisp.
这部分主要是SICP书籍中1.1.6章节的学习理解内容整理。

从这个例子可以看出cond表达式的基本用法。先不看具体的功能,单纯从形式上看很容易让人联想到C语言中的switch case结构。

这是对cond的语法以及功能的描述以及解释。
从功能描述看,其实这个处理过程是一个顺序处理的过程。直到遇到一个能够成功运行的分支之后退出,或者直接没有遇到成功分支走到最后退出。这样的描述其实从我程序员的经历中很容易考虑到一个问题点:如果条件中有几个都可以满足的条件,那么运行结果会是什么样子?针对这个疑问,可以做一个简单的测试。我写了下面的测试代码:

从运行的结果看,我前面的一个考虑点果真是遇到一个就退出,其他的一概不再考虑。因此,即使是有必须要重合的条件判断,我想很多时候排列的顺序会影响最终的运行结果。

这一段代码与前面的代码在描述上有所不同,多了一个else。
这种表达形式,多少有一点让我想到了python中的for、while结构中的else。我觉得两者的设计可能是有相同之处的,不知道后者是否是直接在借鉴lisp的一些设计?继续往后,介绍if表达式的用法。if主要是用于两种情况处理的场景,结合C语言也很容易做理解。
做一个扩展思考:
相比C语言的switch-case结构,cond在软件实现上的应用场景更多、便捷性更好。因为cond中判断的是几种可以分别独立的条件,而switch其实判断的不是条件而是状态。这样,cond在程序流的处理上就会给人一种顺序执行的感觉。解析器会逐个扫描里面的各种条件以及处理逻辑。但也正因为如此,这种扫描的方式必然会带来一定程度上效率的损失。而C语言的switch-case,处理的是一个对象的状态,处理内容更加单一。在分支处理上可以对等到跳转表的模型,以之作为理解参照。由于可以直接做检索偏移跳转,在效率上肯定会好一些。

谓词,从这里看其实主要是与或非等处理。至于什么是谓词,这个涉及到一些语言学的叫法。我对语言语法其实不是很熟悉,更多时候我是取尝试去适应一种表达方式,这必然会是一种符合某一类人群表达习惯的,不是很难理解。至于新的语言的适应,一般来说我觉得可以以我们已经熟悉的语言为蓝本,用新的元素去做解释性的描绘。
这里提到了一个很有意思的知识点,那就是and以及or的处理不是函数的行为。因为很可能函数的参数不会被求值运算。这个很容易理解,有时候部分参数的数值就已经可以绝对最终的结果,多出来的求值运算只是运算的浪费而已。其实,类似的处理也不是现在看的lisp独有的,其他的编程语言应该也有类似的情况。
















