关于java:用java写lisp-解释器-6-if-用宏实现

33次阅读

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

首先看一下之前自定义函数 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))
)

在包装一层

正文完
 0