[plt-scheme] (typeof obj)

From: Robert Nikander (nikander at nc.rr.com)
Date: Mon Jun 11 10:08:26 EDT 2007

On Jun 11, 2007, at 9:27 AM, Shriram Krishnamurthi wrote:
> So you don't really want the type at all: you just want the run-time
> tag on a value.  (That's what *you* want -- is that what the OP
> wants?)  I don't find that very useful.  What you want you can write
> just as well in Scheme:
> (define (run-time-tag-of v)
>  (cond
>    [(number? v) 'number]
>    [(string? v) 'string]
>    ...
>    [(procedure? v) 'procedure]))

When I originally asked the question I wanted write something like:

(lambda (object-from-library)
    (printf "What is it? Answer: ~a ~a" object-from-library (run-time- 
type object-from-library))

Many languages have something like `run-time-type' so I thought there  
might be a similar thing in PLT.  In python it is `type(obj)' and C#  
it is `obj.GetType()'.  And from what Jos Koot said in a previous  
post, the equivalent in PLT would be a procedure that, given any  
Scheme_Object, returns the Scheme_Type.  I'm assuming that  
Scheme_Type is a Scheme_Object.  Is it?  In Python and C#, the type  
objects are objects.

The value of this to me is more about debugging, and exploring and  
understanding the system, and I wasn't thinking about whether a `run- 
time-type' procedure fit in well with good type theory.  Maybe it  
doesn't, but I don't see a problem.

The problem I have with your example above is that it won't work as  
new types are added.

I don't see a problem with structs, because I imagine type objects  
for different structs would be different type objects and not eq?.   
But type objects would probably have a property `name' that was a  
symbol, which could be eq? to the names of other type objects.


Posted on the users mailing list.