[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Test for procedure?
>In article <28600@yale-celray.yale.UUCP>, @MC.LCS.MIT.EDU,@MCC writes:
>> Is there a finer-grained test for procedure values than PROCEDURE? ?
>> As it stands, PROCEDURE? answers true to both procedures and
>> operations (and any other object that can be applied). We need to be
>> able to distinguish actual, honest-to-goodness closures created by
>> LAMBDA from these other apply-able entities
>
>The predicate OPERATION? will let you distinguish operations from everything
>else:
>
> > (operation? (lambda nil nil))
> ()
> > (procedure? (lambda nil nil))
> #T
>
>However, you should normally not need to rely on this distinction. There is
>probably a better way to do what you need to do. For example, if you're
>trying to distinguish closures that you create for some purpose from other
>procedure-like objects lying around, you might create objects instead that
>answer #t to a special predicate.
>
>-- Ashwin.
As is usually the problem in cases like this, I was being sloppy.
We're implementing a different system on top of T, and I wanted to use
T operations to represent our operations, and T procedures to
represent what amount to microcode for the new system. This is just
sloppy design, and I should make a clear distinction between these new
entities and all previously existing ones. In particular, as David
and Ashwin have pointed out, given that I want to directly invoke
these "microcode" objects but still be able to identify them, I
should do something like
(define-predicate microcode?)
(define (make-microcode closure)
(object closure
((microcode? self) t)))
...
(define microcode-add (make-microcode add))
This will allow me to invoke these things with sufficiently little
overhead that I should quit worrying about it.
Thanks for the kick in the pants:-)
By the way, does T3.1 include the fix for proper handling (i.e., no
stack buildup) of tail-recursive operation invocation?
--Mark