Right now we have a situation in which load-source-op is a second class citizen, rarely used, and for which nobody provides explicit dependencies. More precisely
* Some compilers out there are just efficient compiling and loading source files. The operation is the same. * LOAD-OP can be viewed as a slightly more efficient version of an operation that loads sources. * Some users out there do not like compile-before-load procedure. * ASDF makes no promise that load-source-op will behave similarly as load-op. * Users define methods for load-op and not for load-source-op. * In practice the dependencies *must* be the same, for the philosophy of CL is that compiled and not compiled files behave similarly. * The only differences should be enforced to lay just in the compilation process.
I attach a patch which merges both operations, leaving a trace of compatibility.
* There is only one class, LOAD-OP. * The class has the promise that it will use the same dependencies when loading sources and binaries. * When imposing that one does compile the source before, the class issues an additional dependency on a compile-op, which may pull additional dependencies itself. * A global flag, *compile-before-loading* determines the overall behavior * A new function ASDF:LOAD-SOURCE-SYSTEM forces no compilation * The function LOAD-SYSTEM gets a flag, :compile that sets *compile-before-loading* * With these changes it is easy to get a sorted list of the components that make up a program. Furthermore, this list is guaranteed to work because we are using the same operation that we will use to load the files.
(pprint (loop with asdf::*compile-before-loading* = nil for (op . component) in (asdf::traverse (make-instance 'load-op) (find-system "chunga")) collect (list (type-of op) (type-of component) (asdf::component-name component))))
* With this mechanism I can reimplement the fasl concatenation mechanism *without* using classes at all. Same goes for ECL's extensions.
The patch is still not fully tested, but I submit it for discussion, so that ugly corners can be polished.
Juanjo
On Sat, Apr 17, 2010 at 11:26 AM, Juan Jose Garcia-Ripoll < juanjose.garciaripoll@googlemail.com> wrote:
- With this mechanism I can reimplement the fasl concatenation mechanism
*without* using classes at all. Same goes for ECL's extensionshttp://tream.dreamhosters.com
Ok, that is not entirely true: I still have to figure out how the "forcing" mechanism works, because if some of the components was previously loaded the piece of code below will fail to include some components
(pprint (loop with asdf::*compile-before-loading* = nil for (op . component) in (asdf::traverse (make-instance 'load-op) (find-system "chunga")) collect (list (type-of op) (type-of component) (asdf::component-name component))))
Where are the rules for forcing properly explained? The documentation in the code itself is a bit unclear.