[gambit-list] define-type and id

Marc Feeley feeley at iro.umontreal.ca
Sat May 6 02:08:53 EDT 2006


On 6-May-06, at 3:23 AM, Eric Merritt wrote:

> Guys,
>
> I ask this out of curiosity more then anything else. In the
> define-type statements I see have what looks like a generated id
> field. How does this id field get generated? If its not generated how
> does it get calculated?

Here's a type definition that I write in program A:

    (define-type point  ; a 2D point
      x
      y)

Here's a type definition that you write in program B:

    (define-type point  ; a point in a list
      x
      next)

Even though they have the same name these two types are semantically  
different (in the sense that they serve different purposes).  But  
that's OK because they are not in the same scope.

But in a distributed system, programs A and B might exchange  
instances of these types (serializing/deserializing them with object- 
 >u8vector and u8vector->object) and then it becomes important to  
distinguish them, otherwise the programs might silently perform  
illegal operations.

OK, so the name of the type, which is chosen locally by the  
programmer, is not sufficient to distinguish it from other types.

To solve this problem Gambit attaches a type "identifier" to every  
type defined with define-type.  A type identifier is a symbol.  It  
can be specified explicitly when the type is defined, using an "id:"  
keyword.  If this keyword is not used, as in the above examples, then  
an uninterned symbol is automatically generated when the type  
definition is evaluated.  Automatic generation is useful to guarantee  
that the type will never be confused with a type definition evaluated  
elsewhere.  However, in a distributed system you need to guarantee  
that two programs that communicate agree on the type of data they  
exchange.  For example, if programs A and B need to exchange a 2D  
point, then BOTH of these programs would include a type definition  
such as this:

    (define-type point  ; a 2D point
      id: F006B7EE-BDD2-4CBC-8E68-D2CAD2A4E702  ; generated with uuidgen
      x
      y)

That way it is possible for programs A and B to agree on the  
semantics of the "point" type and to test at run time that "point-x",  
"point-x-set!", etc operate on the right type.  Of course this works  
as long as there is a disciplined way of choosing type identifiers  
that are unique in the whole distributed system.  To be safe I  
generally use universally unique identifiers generated with uuidgen.

Marc




More information about the Gambit-list mailing list