图 6.2 Dylan 函数建构器
首先, compose
接受一个或多个函数,并返回一个依序将其参数应用的新函数,即,
(compose #'a #'b #'c)
返回一个函数等同于
#'(lambda (&rest args) (a (b (apply #'c args))))
下面我们建构了一个函数,先给取参数的平方根,取整后再放回列表里,接着返回:
接下来的两个函数, disjoin
及 conjoin
同接受一个或多个谓词作为参数: 当任一谓词返回真时,返回真,而 conjoin
当所有谓词返回真时,返回真。
> (mapcar (disjoin #'integerp #'symbolp)
(T NIL T T)
> (mapcar (conjoin #'integerp #'symbolp)
'(a "a" 2 3))
若考虑将谓词定义成集合, disjoin
返回传入参数的联集(union),而 conjoin
则是返回传入参数的交集(intersection)。
函数 curry
与 rcurry
(“right curry”)精神上与前一小节的 相同。两者皆接受一个函数及某些参数,并返回一个期望剩余参数的新函数。下列任一个函数等同于 (make-adder 3)
:
(curry #'+ 3)
(rcurry #'+ 3)
当函数的参数顺序重要时,很明显可以看出 curry
与 rcurry
的差别。如果我们 curry #'-
,我们得到一个用其参数减去某特定数的函数,
(funcall (curry #'- 3) 2)
而当我们 rcurry #'-
时,我们得到一个用某特定数减去其参数的函数: