首先看一下之前自定义函数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 函数对传入的参数表达式进行 包裹一层 q来源gaodaima#com搞(代@码网uote即可。
这个函数长这样
(define mapQuote (lambda (exp) (map (lambda (o) (cons quote o)) exp))
而后
( (define args (list (> 1 2) 3 (cons 2 4))) (apply if (mapQuote args)) )
在包装一层