[asdf-devel] ASDF traverse changed behavior?

Robert Goldman rpgoldman at sift.info
Wed Mar 17 23:39:36 UTC 2010


On 3/17/10 Mar 17 -6:03 PM, Juan Jose Garcia-Ripoll wrote:
> On Wed, Mar 17, 2010 at 11:54 PM, Juan Jose Garcia-Ripoll
> <juanjose.garciaripoll at googlemail.com
> <mailto:juanjose.garciaripoll at googlemail.com>> wrote:
> 
>     Oh, there is nothing with TRAVERSE's output _right now_.
> 
> 
> Let me clarify this again:
> 
> - The fact that TRAVERSE now adds the same operation for all components
> was new. That was my source of confusion. Before this did not happen
> with LIB-OP and the like. Maybe a straightforrwad solution is just writing
> 
>    (defun perform ((o bundle-op) (c component)) nil)
> 
> so that all components which are not modules get a default PERFORM that
> does nothing. Is this safe?

I believe that this should work fine; it is effectively what is done for
TEST-OP in ASDF, because we can't know what bits of a system are testable.

OTOH, I'm not sure that this is fully /sufficient/ --- I'm not sure what
combination of INPUT-FILES, OUTPUT-FILES and OPERATION-DONE-P are also
necessary.  I'm pretty sure, though, that if you put NIL functions for
the former two and a method on the latter that returns T, that should be
safe.
> 
> - The order and format of TRAVERSE's output is important. Details like
> ensuring that the list includes the operated systems and that a system's
> components appear before the system that owns them, is also important,
> for this allows us to use TRAVERSE for identifying what files make up a
> module, using a variant of
> 
>    (let ((*forcing* t)) (traverse (make-instance 'load-op) some-system))
> 
> which lists all components and all systems that should be loaded, sorted
> in some appropriate order. We rely critically on this, because otherwise
> I do not know a way to traverse a set of systems "portably" without
> redoing all of ASDF's logic.

Right.  I believe that the constraints on the return are that all of the
system's components should appear before the system itself (if they
don't, that's a bug).  OTOH, there are two hedges I would like to make:

1.  The operations can be interleaved arbitrarily.  E.g., there's
nothing about the problem specification to FORCE a system's components
to be operated on IMMEDIATELY before the system object itself.  They
could be separated and other operations interleaved (e.g., LOAD-OP with
COMPILE-OP).

2.  Because of NO-OP performs, the sequence from TRAVERSE can be a
superset of the actual things that happen.  E.g., we emit lots of
TEST-OPs when testing some of our systems, most of which do not
correspond to actually doing anything.  I hope that's not a problem
because I think this is pretty unfixable in the current framework.

r




More information about the asdf-devel mailing list