Paul Rubin wrote: > Ken Tilton <[EMAIL PROTECTED]> writes: > >>>Man that whole thing is messy. I can't for the life of me understand >>>why it's so important to use a macro for that. Even in Lisp, I'd >>>probably set up the reverse thingie as an auxiliary function. >> >>And when you got to skill 42 and you discovered you needed a new >>optional argument to the reversal method you would throw up your hands >>and register for bartending school rather than go edit the other 41. > > > I don't see the problem. Python uses keyword args sort of like > Lisp's, and the called function (if it asks) receives a dictionary > containing any keyword args not bound explicitly in the arg list. > So you can invent new args whenever you want.
I am not making this up. I just decided to change the signature to the reversal function(s). I had been clever, trying to pass in just what I deemed necessary from a transformation (TF) data structure that needed reversing, now I recall -- because I needed something else from the TF -- I should never try to be smart, just pass in the whole frickin TF (duh). So this: (defmethod tf-reverse (id (eql ',sub-id)) resx (drv-opnds tf drv)) ,@reverser) becomes this: (defmethod tf-reverse ((id (eql ',sub-id)) tf drv &aux (opnds (drv-opnds tf drv))) (loop for resx in (results drv) ,@reverser)) I pass in drv (a derivation, a part of a transformation) because (I forgot) reversal code has to reverse each derivation of a TF separately. In the new macroexpansion I preserve the bindings RESX and OPNDS expected by the 41 (not really, but it could be) existing uses of the defskill macro, and then <gasp> move an iteration across possible multiple results (RESXs) of a TF into the generate tf-reverse method (and the poor body of code has no idea I did that). At this point if I had to redo these manually we can forget bartending school, I'd be going straight to the Betty Ford clinic . btw, you called the defskill messy (repeated below) "messy". The only text not specific to absolute value is D-E-F-S-K-I-L-L. Expanding that into "tidy" separate methods adds 25% of dead weight boilerplate. In 4-5 separate toplevel definitions instead of one. How is that less messy? ken (defskill absolute-value (title "Absolute Value") (annotations "Take the absolute value of #signed-value#." "The vertical bars around #signed-value# mean 'the absolute value of' #signed-value#." "Absolute value of #strn# is the 'distance' of #strn# from zero." "Absolute value is always zero or positive: #str|n|=n#, and #str|-n|=n#.") (hints "What do those vertical bars around #signed-value# mean?" "Have you learned about 'absolute value'?" "Absolute value can be thought of as the 'distance' of a value from zero on the number line, and distance is always positive." "The rule is:#str|-n|=|n|##str=n#. Can you apply that to #signed-value#?" "Some examples: #str|+42|=42#, #str|-42|=42#, and #str|0|=0#." "To get the absolute value of a number such as #signed-value#, we simply drop any minus sign.") (reverse (ensure-cloning resx (make-instance 'mx-number :value (loop with op1 = (car opnds) with log = (max 1 (ceiling (log (abs (value op1)) 10))) for n = (* (signum (value op1)) (+ 2 (random (expt 10 log)))) when (/= n (value op1)) return n) :representation (representation resx))))) -- Algebra: http://www.tilton-technology.com/LispNycAlgebra1.htm "Well, I've wrestled with reality for thirty-five years, Doctor, and I'm happy to state I finally won out over it." -- Elwood P. Dowd "I'll say I'm losing my grip, and it feels terrific." -- Smiling husband to scowling wife, New Yorker cartoon -- http://mail.python.org/mailman/listinfo/python-list