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.