关于java:用java写lisp-解释器-4-if-如何通过布尔逻辑实现

38次阅读

共计 881 个字符,预计需要花费 3 分钟才能阅读完成。

在第二篇文章里咱们还留下许多未实现的内置函数 如题目 的 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 个小时的工夫才想明确这所有。

总结

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

正文完
 0