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__