图 6.2 Dylan 函数建构器

    首先, compose 接受一个或多个函数,并返回一个依序将其参数应用的新函数,即,

    1. (compose #'a #'b #'c)

    返回一个函数等同于

    1. #'(lambda (&rest args) (a (b (apply #'c args))))

    下面我们建构了一个函数,先给取参数的平方根,取整后再放回列表里,接着返回:

    接下来的两个函数, disjoinconjoin 同接受一个或多个谓词作为参数: 当任一谓词返回真时,返回真,而 conjoin 当所有谓词返回真时,返回真。

    1. > (mapcar (disjoin #'integerp #'symbolp)
    2. (T NIL T T)
    1. > (mapcar (conjoin #'integerp #'symbolp)
    2. '(a "a" 2 3))

    若考虑将谓词定义成集合, disjoin 返回传入参数的联集(union),而 conjoin 则是返回传入参数的交集(intersection)。

    函数 curryrcurry (“right curry”)精神上与前一小节的 相同。两者皆接受一个函数及某些参数,并返回一个期望剩余参数的新函数。下列任一个函数等同于 (make-adder 3) :

    1. (curry #'+ 3)
    2. (rcurry #'+ 3)

    当函数的参数顺序重要时,很明显可以看出 curryrcurry 的差别。如果我们 curry #'- ,我们得到一个用其参数减去某特定数的函数,

    1. (funcall (curry #'- 3) 2)

    而当我们 rcurry #'- 时,我们得到一个用某特定数减去其参数的函数: