用java写lisp 解释器 (6 if 用宏实现)

首先看一下之前自定义函数if的效果

(
    (define if (lambda (p then_v else_v) 
        ((or (and p car) cdr) (cons then_v else_v))))
    (if (quote (> 1 2)) (3) (cons 2 4))
)

看起来还可以,但是因为涉及入参绑定值的时候会对传入的s表达式进行求值,如果涉及递归的时候就会出问题,因此我们需要增加一个quote, 但这样也导致了新的问题 如果我们想延迟对传入s表达式求值,就需要每一个表达式都进行修饰,无疑增加了许多心智负担,那如何将负担降到最低呢?
我们的期望我们的表达式变成这样:

(if (> 1 2) 3 (cons 2 4))

也就是说 我们只需要一个mapQuote 函数对传入的参数表达式进行 包裹一层 quote即可。
这个函数长这样

(define mapQuote (lambda (exp) (map (lambda (o) (cons quote o)) exp))

然后

(
    (define args (list (> 1 2) 3 (cons 2 4)))
    (apply if (mapQuote args))
)

在包装一层

你可能感兴趣的:(用java写lisp 解释器 (6 if 用宏实现))