reduce uses a binary operation, function,
to combine the elements of sequence
bounded by start and end.
The function must accept as arguments two elements
of sequence or the results from combining those elements.
The function must also be able to accept no arguments.
If key is supplied, it is used is used to extract the values to reduce.
The key function is applied exactly once to each element of sequence
in the order implied by the reduction order but not to the value of
initial-value, if supplied.
The key function typically returns part of the element of sequence.
If key is not supplied or is nil, the sequence element itself is used.
The reduction is left-associative,
unless from-end is true in which case it is right-associative.
If initial-value is supplied,
it is logically placed before the subsequence
(or after it if from-end is true)
and included in the reduction operation.
In the normal case, the result of reduce is the combined
result of function's being applied to successive pairs of elements
of sequence.
If the subsequence contains exactly one element
and no initial-value is given,
then that element is returned and function is not called.
If the subsequence is empty and an initial-value is given,
then the initial-value is returned and function is not called.
If the subsequence is empty and no initial-value is given,
then the function is called with zero arguments,
and reduce returns whatever function does.
This is the only case where the
function is called with other than two arguments.