merits of Lisp vs Python
Ken Tilton
kentilton at gmail.com
Wed Dec 13 19:21:46 EST 2006
Ken Tilton wrote:
>
>
> Paul Rubin wrote:
>
>> Ken Tilton <kentilton at gmail.com> writes:
>>
>>> Have you read On Lisp by Paul Graham? It is on-line. Just the preface
>>> will do, I think, maybe also Chapter One where he raves on macros. Do
>>> you think he is mistaken? Confused? Lying? Mutant?
>>
>>
>>
>> I remember Paul Graham's piece about macros that made him sound like
>> someone who went nuts with them, as is certainly possible to do.
>
>
> But you could have just flipped thru the rest of the pages to see if he
> /had/ gone nuts with them!
>
>> In
>> my experience, good coders write for clarity and that includes in
>> their use of Lisp macros. All in all Lisp's macro system is something
>> like the C preprocessor. Yes, you can obfuscate things horribly with
>> it, but you can also use it to make things clearer, and that's what
>> good programmers do.
>
>
> One has to be from the US and of a certain age to remember this, but
> this old line from a commercial for high-octane gasoline says it for me:
> power to be used, not abused.
Here is a bit of concrete I just tossed off:
(defmacro defskill (id &body skill-info)
`(progn
,@(loop with sub-id = id
for (q . q-def) in skill-info
collecting
(ecase q
((title annotations hints)
`(defmethod ,(intern (conc$ 'skill- q)) ((tf-id (eql
',sub-id)))
, at q-def))))))
It lets me code this:
(defskill absolute-value
(title "Absolute Value")
(annotations
"Take the absolute value of #op#."
"The vertical bars around #op# mean 'the absolute value of' #op#."
"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 #op# 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 #op#?"
"Some examples: #str|+42|=42#, #str|-42|=42#, and #str|0|=0#."
"To get the absolute value of a number such as #op#, we simply drop
any minus sign."))
...and get this:
(PROGN
(DEFMETHOD SKILL-TITLE ((TF-ID (EQL 'ABSOLUTE-VALUE)))
"Absolute Value")
(DEFMETHOD SKILL-ANNOTATIONS ((TF-ID (EQL 'ABSOLUTE-VALUE)))
"Take the absolute value of #op#." "The vertical bars around #op#
mean 'the absolute value of' #op#."
"Absolute value of #strn# is the 'distance' of #strn# from zero."
"Absolute value is always zero or positive: #strn=n#, and #str-n=n#.")
(DEFMETHOD SKILL-HINTS ((TF-ID (EQL 'ABSOLUTE-VALUE)))
"What do those vertical bars around #op# 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 #op#?" "Some
examples: #str+42=42#, #str-42=42#, and #str0=0#."
"To get the absolute value of a number such as #op#, we simply
drop any minus sign."))
The above is how my upcoming death-defying interactive Algebra
tutor-in-a-drum ("You'll laugh! You'll cry!") will know how to coax some
befuddled teen through |-42| -> 42 if they get stuck. And a hundred
other subskills (so there will be a hundred of these definitions).
If I hire someone they will look at defskill and not fall to the ground
frothing at the mouth. They likely will not even macroexpand it because
it is self-explanatory. If they wonder if there are other options they
can alt-. to the source. The language has been extended, but I followed
a pattern familiar to Lispniks. Zero confusion results.
If I decide not to use generic method dispatch to "look up" the hints I
just have to change the macro and then write a DEFUN (no dispatch on
type) to, say, look up the symbol in a hash table.
hth,ken
ps. I won't mention the other benefit, which is that I want educators to
edit these if they have a better idea on how to tutor absolute value. I
am not mentioning it because I am as impatient with superfluous syntax
as a non-programmer would be. k
pps. How would Python do this? Is it possible to avoid committing to an
implementation mechanism? Compare and contrast. k
--
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
More information about the Python-list
mailing list