Le 19/03/2021 à 18:58, Marco Antoniotti a écrit :
Hi

I am trying to create a new ASDF:OPERATION, but I must be missing something and the manual (or Google) does not seem to help much.

How do you create a new operation, which may be quite simple?  Or better, how do you get PERFORM and/or OPERATE to actually do something for you.

I know I should RTFM, but in this case it is more of a RTFC, which is far more difficult.

I tried the following

(defclass my-op (non-propagating-operation) ())

(defmethod perform ((o my-op) (s system))
    (print 42))

(defmethod operate ((o my-op) (s system) &key &allow-other-keys)
    (print 666))

But then, doing

cl-user 42> (operate 'my-op (find-system "somesys") :bar 1024)
#<MY-OP >
#<ASDF/PLAN:SEQUENTIAL-PLAN 2301B97B>

is all I get.

Any tutorial or advice?


If you don't override operate, then the inherited operate will call your overriden perform:


cl-user> (defclass my-op (non-propagating-operation) ())

(defmethod perform ((o my-op) (s system))
   (print 42))
#<standard-method asdf/action:perform (my-op system) {1007690373}>
cl-user> (operate 'my-op (find-system "cl-naive-store") :bar 1024)

42
#<my-op >
#<sequential-plan {10076CDA23}>
cl-user>


Alternatively, you may also override operate, but you need to call the next method (or use a :before or :after method:


cl-user> (defmethod operate ((o my-op) (s system) &rest keys &key &allow-other-keys)
           (print (list 666 keys))
           (call-next-method o s))
#<standard-method asdf/operate:operate (my-op system) {10082AB6E3}>

cl-user> (operate 'my-op (find-system "xmls") :bar 1024)
; loading #P"/Users/pjb/quicklisp/dists/quicklisp/software/xmls-3.0.2/xmls.asd"

(666 (:bar 1024))
42
#<my-op >
#<sequential-plan {100857BF33}>
cl-user> (operate 'my-op (find-system "xmls") :bar 1024)

(666 (:bar 1024))
#<my-op >
#<sequential-plan {1002AFF8A3}>
cl-user>


Note that default asdf:operate method registers that the perform method has been called on the system, so it doesn't call it again.


--
__Pascal Bourguignon__

Reply via email to