当前位置: 首页 > 后端技术 > Java

用java写一个lisp解释器(4如何通过布尔逻辑实现if)

时间:2023-04-01 20:48:13 Java

第二篇文章,我们还是留下了很多未实现的内置函数,比如标题中的if,但是这次我们不打算用内置函数的方式实现if,还有别的办法吗?当然还有,比如题目是通过布尔逻辑的andornot,还有之前实现过的let,lambda,apply,var,cons。开始吧。准备布尔逻辑首先我们检查一下我们已有的布尔逻辑and:当所有子结构的值都为真时and的返回值为真。实际上,and的结果就是最后一个子结构的值。如果任何子结构的计算结果为假,则返回#f。or:返回其第一个真正的子结构的结果。如果所有子结构的计算结果为假,则返回#f。notNegativetheresult定义if结构(ifpredicatethen_valueelse_value)编码实现只需要一行代码(let((if(lambda(pthen_velse_v)((or(andpcar)cdr)(consthen_velse_v)))))(..))核心代码(lambda(pthen_velse_v)((or(andpcar)cdr)(consthen_velse_v)))下面看布尔逻辑部分(or(andpcar)cdr)首先,如果p为真,则返回car,然后或者,如果p为假,则返回cdr;也许你会问为什么car没有被then_v代替,cdr没有被else_v代替,原因是firstand假设p为真,如果then_v为假怎么办?我们会发现then_v和else_v都被执行了。问题的关键在于then_v可能为false或者0,所以我们换个思路,如果p为真,返回第一个值,否则返回第二个值,因为这个值可能为false,所以如果为true是否正常?答案是肯定的,所以我们需要一点魔法。我们可以在值外包裹一个永远为真的值,然后在使用的时候去掉包裹。显然有一种方法可以帮助我们。它可以是cons或other,但这一切并不明显,我花了1小时才弄明白。综上所述,在很多情况下,通过直接的方法无法获得符合我们预期的结果。有时只需要加一层中间层,当然也可以不止一层。我认为编程是一样的,生活也是如此。