[m-dev.] for discussion: foreign_export_enum syntax

Julien Fischer juliensf at csse.unimelb.edu.au
Wed Jun 27 18:54:58 AEST 2007

I have been working on the change to allow Mercury enumeration constants
to be exported to foreign languages.  The majority of the changes to
the compiler were made last year; what remains undecided is the
concrete syntax.  Below is change to the reference manual that describes
the current version of this new feature.  Here is a small example of
how it would look and work in the case where C is the foreign language.


:- type foo
 		--->	foo
 		;		bar
 		;		baz.

 	:- pragma foreign_export_enum("C", foo, [bar - "BAR],

would cause the following declaration to be generated in the .mh file.

 	enum {
 			MR_foo = 0,
 			MR_BAR = 1,
 			MR_baz = 2

(The following diff does not yet contain the language specific information
for pragma foreign_export_enum.)

Any comments or suggestions welcome.


Index: reference_manual.texi
RCS file: /home/mercury1/repository/mercury/doc/reference_manual.texi,v
retrieving revision 1.397
diff -u -r1.397 reference_manual.texi
--- reference_manual.texi	12 Jun 2007 06:53:57 -0000	1.397
+++ reference_manual.texi	27 Jun 2007 08:44:15 -0000
@@ -6176,7 +6176,10 @@
                                         programming language.
  * Using foreign types from Mercury::   How to use a type defined in
  				       a different programming language
-				       in Mercury code. 
+				       in Mercury code.
+* Using Mercury enumerations in foreign code:: How to use a enumeration type
+                                               defined in Mercury in a
+                                               different programming language.
  * Data passing conventions::	       How Mercury types are passed to
  				       different languages.
  * Adding foreign declarations::        How to add declarations of
@@ -6867,6 +6870,71 @@

  @c -----------------------------------------------------------------------

+ at node Using Mercury enumerations in foreign code
+ at section Using Mercury enumerations in foreign code
+Values of Mercury enumeration types can be made available to code in the
+bodies of @samp{foreign_proc} and @samp{foreign_code} pragmas via
+a declaration of the form:
+ at example
+:- pragma foreign_export_enum(@var{Lang}, @var{MercuryType},
+        @var{Overrides}, @var{Attributes}).
+ at end example
+This causes the compiler to create a symbolic name in language
+ at var{Lang} for each of the constructors of @var{MercuryType}.
+The symbolic name allows the foreign code to create a value
+corresponding to that of the constructor it represents.
+(The exact mechanism used depends upon the foreign language;
+see the language specific information below for further details.)
+For each foreign language there is a default mapping between the name
+of a Mercury constructor and its symbolic name in the language @var{Lang}.
+This default mapping is not required to map every valid constructor name
+to a valid name in language @var{Lang}; where it does not the programmer
+must specify a valid symbolic name.
+The programmer may also choose to map a constructor to a symbolic name
+that differs from the one supplied by the default mapping for language
+ at var{Lang}.
+ at var{Overrides} is a list of pairs of constructor names and strings of
+the following form:
+ at example
+[consI - "symbolI", ..., consJ - "symbolJ"]
+ at end example
+This can be used to provide either a valid symbolic name where the
+default mapping does not, or to override a valid symbolic name
+generated by the default mapping.
+The argument @var{Attributes} is a list of optional attributes.
+If empty, it may be omitted from the @samp{pragma foreign_export_enum}
+The following attribute must be supported by all Mercury implementations.
+ at table @asis
+ at item @samp{prefix(Prefix)}
+Prefix each symbolic name, regardless of how it was generated, with
+the string @var{Prefix}.
+This occurs @emph{before} the validity of the symbolic name in the
+foreign language is checked, i.e. the effect of the @samp{prefix}
+attribute may cause an otherwise valid symbolic name to become invalid or
+vice versa.
+ at end table
+It is an error for a single constructor to be mapped to two different symbolic
+names by a single @samp{pragma foreign_export_enum} declaration.
+A program can contain multiple @samp{pragma foreign_export_enum}
+declarations for a single Mercury type.
+A module may contain @samp{pragma foreign_export_enum} declarations that
+refer to imported types, subject to the usual visibility restrictions.
+ at c -----------------------------------------------------------------------
  @node Adding foreign declarations
  @section Adding foreign declarations

mercury-developers mailing list
Post messages to:       mercury-developers at csse.unimelb.edu.au
Administrative Queries: owner-mercury-developers at csse.unimelb.edu.au
Subscriptions:          mercury-developers-request at csse.unimelb.edu.au

More information about the developers mailing list