[plt-scheme] Linking Scheme- and C-variables
> I access c-doubles, for example, by making a
> closure-like primitive for
> each variable:
>
> scheme_add_global( "access-the-double",
> scheme_make_closed_prim_w_arity(
> AccessADouble,
>
> &theDouble,
>
> "access-the-double",
>
> 0, 1), e);
>
> AccessADouble is written to return theDouble with
> scheme_make_double(theDouble). If a parameter is
> supplied, it is
> validated then stored in theDouble first.
>
> Ie, (access-the-double 12.3) "sets" theDouble to
> 12.3.
> (access-the-double) "gets" 12.3 .
That's exactly what I'm trying to avoid: making access-functions for
each variable that should be used :)
But now that access-functions is the only way to do it, what do people
here thinks of the following solutions I thought of (please note that
it's a game I'm making, so be performance-minded):
1. The variables are stored in C, so to speak, and all variables are
registered in a std::map <std::string, T*> (yes, I use C++. Please
don't kill me ;)) where T* is a pointer to the type (so there's one
map for each type used).
We can now make an access-function for each type instead of each
variable.
So to access the integer foo we use
(get-int "foo")
which will look for the key "foo" in the map containg pointers to the
integers and return the value of the integer pointed to by the item
with the key "foo". And similar we can set foo to 42 with
(set-int "foo" 42)
and the use the hack posted by Eli Barzilay while I was writing
this mail.
The stupid thing about this method, I guess, is that the map should
be managed the whole time (when making/deleting variables).
2. The variables are in the Scheme environment and can be accessed in
similar ways:
SCHEME_INT_VAL( scheme_evaluate_string("foo", env) ) to get the
value of the integer foo. To set the variable:
Scheme_Object * args[2] = {scheme_evaluate_string("foo", env),
scheme_make_integer(42)};
scheme_apply(set, 2, args);
where
Scheme_Object * set = scheme_evaluate_string("set!", env);
This could either be encapsulated in C-functions (taking a string
argument that contains the name of the variable) or in a class (one
for each type) with overloaded 'type'-operator (for example operator
int for the integer-wrapper class) and = operator. I like the latter
best.
So what do the gurus here think?
> I veered away from the set! route since I don't like the idea of
> parallel universes of variables when the two languages are so
> different. What happens if a c-double shadows a scheme variable that
> is set with (sqrt -1) ?
Mmh, yes, I'll have to watch my step.