[alexandria-devel] conjoin bug fix
Tobias C. Rittweiler
tcr at freebits.de
Fri Oct 30 11:29:47 UTC 2009
Kilian Sprotte <kilian.sprotte at gmail.com> writes:
> Hi,
>
> I stumbled (probably due to some macro-expansion) over the following
> degenerate case of conjoin:
>
> (funcall (conjoin #'zerop) 0)
>
> It fails with NIL is not a function.
>
> I propose the changes below (also attached as a darcs patch).
>
> Cheers,
> Kilian
>
> Thu Oct 15 16:42:45 CEST 2009 Kilian Sprotte <kilian.sprotte at gmail.com>
> * conjoin bug fix for single predicate argument
> diff -rN old-alexandria/functions.lisp new-alexandria/functions.lisp
> 40,49c40,51
> < (lambda (&rest arguments)
> < (and (apply predicate arguments)
> < ;; Cannot simply use CL:EVERY because we want to return the
> < ;; non-NIL value of the last predicate if all succeed.
> < (do ((tail (cdr more-predicates) (cdr tail))
> < (head (car more-predicates) (car tail)))
> < ((not tail)
> < (apply head arguments))
> < (unless (apply head arguments)
> < (return nil))))))
> ---
>> (if (null more-predicates)
>> predicate
>> (lambda (&rest arguments)
>> (and (apply predicate arguments)
>> ;; Cannot simply use CL:EVERY because we want to return the
>> ;; non-NIL value of the last predicate if all succeed.
>> (do ((tail (cdr more-predicates) (cdr tail))
>> (head (car more-predicates) (car tail)))
>> ((not tail)
>> (apply head arguments))
>> (unless (apply head arguments)
>> (return nil)))))))
This looks ok. (Except that unified diffs are usually preferred.)
> diff -rN old-alexandria/tests.lisp new-alexandria/tests.lisp
> 359a360,365
>> (deftest conjoin.2
>> (let ((conjunction (conjoin #'zerop)))
>> (list (funcall conjunction 0)
>> (funcall conjunction 1)))
>> (t nil))
>>
If you're at it, could you also provide similiar test cases for the
other functions defined in functions.lisp?
-T.
More information about the alexandria-devel
mailing list