On 3/17/10 Mar 17 -4:33 AM, Juan Jose Garcia-Ripoll wrote:
On Wed, Mar 17, 2010 at 9:58 AM, Juan Jose Garcia-Ripoll <juanjose.garciaripoll@googlemail.com mailto:juanjose.garciaripoll@googlemail.com> wrote:
Before, if an operation defined by me, such as LIB-OP, did not traverse a system, then the only operation we got was that operation applied on the system, as a generic object. Now TRAVERSE not only imposes the LIB-OP operation on the system, but it also scans the components and imposes the operation on the components.
Instead of having TRAVERSE use some kind of hard-coded logic as it does now
(let ((module-ops (when (typep c 'module)
[...] (dolist (kid (module-components c)) (handler-case
why not go back to something more reasonable which is based on COMPONENT-DEPENDS-ON
(defmethod component-depends-on ((o operation) (c system)) ...)
I tried to come up with a cleaner method when I rewrote TRAVERSE to fix the module dependency bug. I couldn't find a way to do this.
The short answer is that the problem comes from the way ASDF uses MODULE components to represent two different things at once:
1. The operation to be done on the module as a whole (including the operation done on its children) and
2. Any clean up operations that don't live on a component (let's say you want to write an entry in a table after a module is combined).
Recall that PERFORM applied to a module is done AFTER any operations on the component's children. Similarly, OPERATION-DONE-P on the module pays no attention to whether the children are done, nor does OPERATION-DONE-P in general pay any attention to the dependencies.
If you think THIS bug fix was bad for backward compatibility, believe me, doing something "more reasonable" would make your head swim!
That said, if you have a better patch, feel free to provide it. Other than that, I discussed this on the list till I was blue in the face while the modifications were underway. This will be my last message on the subject; please read over the archive of the list to see why TRAVERSE was modified in the way it was. If you have any remaining questions, I will be happy to entertain them, but I am not going over this ground again.
Best, R