一次造轮子的经历
因为我的Scheme入门书是Dan Friedman的《The Little Schemer》,老爷子从头到尾都没有提到过if
。所以一直到翻完整本书,对于只有2个分支的逻辑,我也是用这么“蠢萌”的方式写的(这里的cond
可以理解成if
的多分支的版本):
(define (my-abs x)
(cond ((>= x 0) x)
(else (- x))))
所谓杀鸡焉用牛刀,既然“if-then-else”的简洁性摆在那里,造轮子的事肯定也是干过的:
(define (my-if predicate then-clause else-clause)
(cond (predicate then-clause)
(else else-clause)))
通过自定义my-if
函数,我们自己实现了if
的功能。来测试一下:
(my-if (= 1 2) 0 1)
;Value: 1
(my-if (= 1 1) 0 1)
;Value: 0
scheme的波兰表达式写法,让自定义函数和默认关键字之间没有明显的区分。接下来就可以把最开始的my-abs
改写的简短一点:
(define (my-abs x)
(my-if (>= x