[gambit-list] define-type and id

Eric Merritt cyberlync at gmail.com
Mon May 8 17:14:22 EDT 2006


Marc,

 Thanks for the detailed response, this clears up the question very
well.. I have a minor additional question. define-type and
define-structure seem very similar (with the exception of the id
field). Why two different expressions for, what seems to be, the same
model?

On 5/5/06, Marc Feeley <feeley at iro.umontreal.ca> wrote:
> 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