函数 a-plus-abs-b 是第一个展示高阶函数的例子:
;;; 4-a-plus-abs-b.scm
(define (a-plus-abs-b a b)
((if (> b 0) + -) a b))
在 if 的判断部分,它根据 b 的值决定是返回 + 函数还是 - 函数,当 b 大于 0 时,它返回 + 函数:
1 ]=> (if (> 1 0) + -)
;Value 11: #[arity-dispatched-procedure 11]
1 ]=> +
;Value 11: #[arity-dispatched-procedure 11]
当 b 不大于 0 时,它返回 - 函数:
1 ]=> (if (> -1 0) + -)
;Value 12: #[arity-dispatched-procedure 12]
1 ]=> -
;Value 12: #[arity-dispatched-procedure 12]
测试:
1 ]=> (load "4-a-plus-abs-b.scm")
;Loading "4-a-plus-abs-b.scm"... done
;Value: a-plus-abs-b
1 ]=> (a-plus-abs-b 2 (- 2))
;Value: 4
1 ]=> (a-plus-abs-b 2 2)
;Value: 4
这种『将函数作为值来传递』是高阶函数能力的一部分,但这还只是开始,后面我们还会看见更多这方面的应用。
Note
在一些语言中, + 和 - 都是具有特殊作用的运算符(operator),但是在 scheme (和许多其他函数式语言)中,它们只是函数。