[m-rev.] for review: foreign enumerations
Ian MacLarty
maclarty at csse.unimelb.edu.au
Fri Aug 10 09:03:37 AEST 2007
On Thu, Aug 09, 2007 at 06:28:50PM +1000, Julien Fischer wrote:
>
> The changes to RTTI and tabling are for review by Zoltan.
> The rest is for review by anyone.
>
> Estimated hours taken: 50
> Branches: main
>
> Add support for foreign enumerations to Mercury. These allow the
> programmer to assign foreign language values as the representation of
> enumeration constructors.
>
> e.g.
> :- type status
> ---> optimal
> ; infeasible
> ; unbounded
> ; unknown.
>
> :- pragma foreign_enum("C", status/0, [
> optimal - "STATUS_OPTIMAL",
> infeasible - "STATUS_INFEASIBLE",
> unbounded - "STATUS_UNBOUNDED",
> unknown - "STATUS_UNKNOWN"
> ]).
>
> The advantage of this is that when values of type status/0 are passed to
> foreign code (C in this case) no translation is necessary. This should
> simplify the task of writing bindings to foreign language libraries.
>
> Unification and comparison for foreign enumerations are the usual
> unification and comparison for enumeration types, except that the default
> ordering on them is determined by the foreign representation of the
> constructors. User-defined equality and comparison work also work.
> on foreign enumeration types.
>
> In order to implement foreign enumerations we have to introduce two
> new type_ctor representations. The existing ones for enum type do not
> work since they use the value of an enumeration constructor to perform
> table lookups in the RTTI data structures. For foreign enumerations
> we need to perform a linear search at the corresponding points. This
> means that some RTTI operations related to deconstruction are more
> expensive.
>
> The dummy type optimisation is not applied to foreign enumerations as
> the code generators currently initialise the arguments of non-builtin
> dummy type foreign_proc arguments to zero. For unit foreign enumerations
> they should be initialised to the correct foreign value. (This is could be
> implemented but in practice it's probably not going to be worth it.)
>
Does this mean that if I have the type:
:- type open_mode
---> read.
:- pragma foreign_enum("C", open_mode/0, [
read - "MODE_READ"
]).
then when I pass a value of this type to foreign code it will always
have the value 0 instead of MODE_READ? I might want to look at the
value of this type, because I may be planning to extend it with more
options (for example a 'write' option) in future. So I think
initialising the value to the correct foreign value would definitely be
worth it.
Ian.
--------------------------------------------------------------------------
mercury-reviews mailing list
Post messages to: mercury-reviews at csse.unimelb.edu.au
Administrative Queries: owner-mercury-reviews at csse.unimelb.edu.au
Subscriptions: mercury-reviews-request at csse.unimelb.edu.au
--------------------------------------------------------------------------
More information about the reviews
mailing list