On Wed, Jul 17, 2013 at 12:37 PM, Robert P. Goldman rpgoldman@sift.info wrote:
I have seen the same phenomenon that Attila refers to, across different machines and different lisp implementations.
I remember having lots of issues with ASDF1 and ASDF2 in the past. Hopefully, they are fixed with ASDF3.
I had been chalking it up to differences in sorting and hash table behaviors.
I don't remember ASDF ever iterating over hash-tables, or using sort, for the matter. It seems to me that ASDF has always been deterministic in its traversal order, though its order hasn't always been quite intuitive.
Now if you want actual non-determinism, try POIU in non-deterministic mode (used to be the only option, now deterministic is the default and the somewhat faster non-deterministic mode can be enabled by the user). Of course, any determinism is dependent on the state of the filesystem with respect to what was already successfully compiled, and to your program not depending on the presence or absence of compile-time side-effects that weren't in a proper eval-when.
It can be annoying because, as Attila points out, the nondeterminism/partial order (in the sense that the algorithm as coded in CL does not uniquely determine a build order) can mask bugs in system dependency specification -- system definitions with missing dependencies can seem to work.
I do not believe that this problem is acute enough to try to fix with explicit randomization, especially since the partial ordering is something ASDF exploits to minimize rebuilds. I think it would be better to provide groveling support that supports programmers who wish to check/improve their system definitions. The cost of introducing explicit randomization in code complexity, need for repeated test runs, etc., seems like a bad trade-off.
Actually, an ASDF variant that shuffles partially ordered components randomly, and repeatedly rebuilds, as a tool that one could run on a cloud service or something to check definitions might be a fun project. But it's not something I think should go into core ASDF.
Of course, there is the solution provided by XCVB, of always building each component from its declared dependencies only. A variant of ASDF could use POIU-style forking to achieve the same effect. Or you could use XCVB itself.
—♯ƒ • François-René ÐVB Rideau •Reflection&Cybernethics• http://fare.tunes.org You can learn many things from children. How much patience you have, for instance. — Franklin P. Jones