在第二篇文章里咱们还留下许多未实现的内置函数 如题目 的 if, 不过这次咱们并不打算通过内置函数的形式去实现 if, 那么还有其余方法吗,当然是有的,如题目那就是通过布尔逻辑 与或非,还有之前曾经实现的 let、lambda、apply、var、cons 让咱们开始吧。
筹备工作
布尔逻辑
首先咱们先检查一下咱们已有的布尔逻辑
- and: 当所有子结构的值都是真时,and 的返回值是真,实际上,and 的运行后果是最初一个子结构的值。如果任何一个子结构的值都是假,则返回 #f。
- or: 会返回它第一个为值为真的子结构的后果。如果所有的子结构的值都为假,or 则返回 #f。
- not 对后果取反
定义 if 构造
(if predicate then_value else_value)
编码实现
只须要一行代码
(let ((if (lambda (p then_v else_v) ((or (and p car) cdr) (cons then_v else_v))))) (..))
外围代码
(lambda (p then_v else_v) ((or (and p car) cdr) (cons then_v else_v)))
让咱们看一下布尔逻辑的局部
(or (and p car) cdr)
先是 and,如果 p 为真返回 car,而后是 or,如果 p 为假返回 cdr;兴许你会问为什么 car 不换成 then_v,cdr 不换成 else_v 呢,起因在于 第一个的 and 假如 p 为真时,如果 then_v 的值是 false 会产生什么呢?咱们会发现 then_v 与 else_v 都被执行了,问题的要害就是 then_v 有可能是 false 或 0,因而咱们换个思路,如果 p 为真返回第一个值否则返回第二个值 既然值有可能会是假,那么值为真是不是就失常了呢?答案是是的,因而咱们须要一点魔法,咱们在值里面包裹一层永远是 true 的值即可,而后应用时在把包裹去掉即可,显然有一个办法能够帮忙咱们它是 cons 也能够是其余,但这所有并不是不言而喻的,我破费了 1 个小时的工夫才想明确这所有。
总结
很多时候通过间接的形式并不能失去合乎咱们期待的后果,有时只须要减少一个中间层即可,当然也能够是多个,我想编程是如此,生存亦是如此。