On 1/25/10 Jan 25 -1:58 PM, Robert Brown wrote:
Thanks again for responding to my questions. I've interleaved a few comments below.
On 1/23/10, Robert Goldman rpgoldman@sift.info wrote:
On 1/23/10 Jan 23 -1:13 PM, Robert Brown wrote:
Protocol description files (suffix .proto) need to be converted into Lisp source, which is then compiled and loaded. I'm trying to get the dependencies right in one of my COMPONENT-DEPENDS-ON methods.
I may be able to help with this --- I have some examples of cases where I have written preprocessors that turn some outside languages into lisp through preprocessing.
I believe I have something that works, but it's a bit suboptimal. For each proto file I have 2 components, one that converts the proto file into a Lisp source file, and a second that compiles and loads the Lisp code. It would be nice to combine these two components into just one ASDF component.
I wrote an ASDF operation that took the output of the Protege ontology GUI and pushed it through a colleague's perl script to yield lisp output that ASDF then compiles and loads.
I did this by adding a new type of component that's a subclass of cl-source-file and adding a new operation that must be done before doing the compile-op. That new operation finds the /real/ source file and pushes it through the perl script...
This last aspect is a little undesirable --- it would probably be better if the code was written so that you specify the real source file, and we were to compute the input-files for the lisp from that. But that would have required more new code writing...
Here are some snippets. If you correct/improve them, please share it, and maybe we can turn this into a howto:
;;; need to add methods that will handle the making of this from the protege ;;; ontology input file. [2008/09/23:rpg] (defclass pont-file (cl-source-file) () (:documentation "This is an ontology file that must be built from a protege ontology output file.") )
(defclass pont-to-lisp (operation) () (:documentation "The process of translating a Protege ontology to a lisp source file, performed by a perl script.") )
(defmethod component-depends-on ((op compile-op) (c pont-file)) (append (call-next-method) `((pont-to-lisp ,(component-name c)))))
(defmethod output-files ((op pont-to-lisp) (c pont-file)) ;; this is my shorthand ;; way of saying that the process of doing pont-to-lisp on a pont-filename ;; should yield this lisp filename... [2008/09/24:rpg] (list (component-pathname c)))
;;; there's a horrible method for input-files on pont-to-lisp X ;;; pont-file which I will spare you to save myself embarrassment (defmethod perform ((op pont-to-lisp) (c pont-file)) (asdf:run-shell-command "perl ~a ~a > ~a" *ptolisp* (namestring (first (input-files op c))) (namestring (first (output-files op c)))))
This seems to mostly work, but I've never been confident that it is the right thing.
....
Have you tried looking at component-do-first as well as in-order-to?
I think I see what's going on now. In addition to the IN-ORDER-TO dependencies, ASDF records an additional dependency in the DO-FIRST slot. When :depends-on is specified, the DO-FIRST slot is set:
(setf (slot-value ret 'do-first) `((compile-op (load-op ,@depends-on))))
This is strange to me. Why put dependencies in two different places? The DO-FIRST dependency cannot be supplied by providing a new implementation of the COMPONENT-DEPENDS-ON method. It's only set when :depends-on is used in the system definition.
I'm unfamiliar with ASDF internals, but I think the semantics of ASDF dependencies would be more straightforward if DO-FIRST were removed and IN-ORDER-TO used for all dependencies.
I wish I could tell you --- I don't see any comments here. I presume that there's some good reason for this having been added, but I don't know what it would be.
I wonder if it's a method-combination thing --- like the way that some functions were forced into standard method combination because CLISP once upon a time didn't have PROGN, AND, APPEND, etc.
Maybe Dan Barlow or somebody will see this and comment...
Sorry I can't be more helpful.
best, r