What's better about Ruby than Python?

Andrew Dalke adalke at mindspring.com
Thu Aug 21 02:18:00 EDT 2003


Kenny Tilton:
> This macro:
>
> (defmacro c? (&body code)
>    `(let ((cache :unbound))
>       (lambda (self)
>         (declare (ignorable self))
>         (if (eq cache :unbound)
>    (setf cache (progn , at code))
> cache))))

I have about no idea of what that means.  Could you explain
without using syntax?  My guess is that it caches function calls,
based only on the variable names.  Why is a macro needed
for that?

>>> import time
>>> def CachedCall(f):
...    cache = {}
...    def cached_call(self, *args):
...       if args in cache:
...          return cache[args]
...       x = f(self, *args)
...       cache[args] = x
...       return x
...    return cached_call
...
>>> class LongWait:
...    def compute(self, i):
...       time.sleep(i)
...       return i*2
...    compute = CachedCall(compute)
...
>>> t1=time.time();LongWait().compute(3);print time.time()-t1
6
3.01400005817
>>> t1=time.time();LongWait().compute(3);print time.time()-t1
6
0.00999999046326
>>>

(Need to use the function instead of a class with __call__
so that the method gets bound correctly.  And I believe
this won't work if the class is derived from object.  Nope!
I'm wrong.  It does work.)

                    Andrew
                    dalke at dalkescientific.com






More information about the Python-list mailing list