在第二篇文章里咱们还留下许多未实现的内置函数 如题目 的if,不过这次咱们并不打算通过内置函数的形式去实现if,那么还有其余方法吗,当然是有的,如题目那就是通过布尔逻辑 与或非,还有之前曾经实现的 let、lambda、 apply、 var、cons让咱们开始吧。

筹备工作

布尔逻辑

首先咱们先检查一下咱们已有的布尔逻辑

  1. and: 当所有子结构的值都是真时,and的返回值是真,实际上,and的运行后果是最初一个子结构的值。如果任何一个子结构的值都是假,则返回#f。
  2. or: 会返回它第一个为值为真的子结构的后果。如果所有的子结构的值都为假,or则返回#f。
  3. 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个小时的工夫才想明确这所有。

总结

很多时候通过间接的形式并不能失去合乎咱们期待的后果,有时只须要减少一个中间层即可,当然也能够是多个,我想编程是如此,生存亦是如此。