Modula-3: introduction, ordinal types, file types, features, objects
git-svn-id: https://swig.svn.sourceforge.net/svnroot/swig/trunk/SWIG@6178 626c5289-ae23-0410-ae9c-e8d60b6d4f22
This commit is contained in:
parent
543127c37b
commit
4f093d90b8
2 changed files with 221 additions and 87 deletions
|
|
@ -642,11 +642,16 @@
|
||||||
<!-- INDEX -->
|
<!-- INDEX -->
|
||||||
<ul>
|
<ul>
|
||||||
<li><a href="Modula3.html#modula3_overview">Overview</a>
|
<li><a href="Modula3.html#modula3_overview">Overview</a>
|
||||||
|
<ul>
|
||||||
|
<li><a href="Modula3.html#whyscripting">Why not scripting ?</a>
|
||||||
|
<li><a href="Modula3.html#whymodula3">Why Modula-3 ?</a>
|
||||||
|
<li><a href="Modula3.html#whycpp">Why C / C++ ?</a>
|
||||||
|
<li><a href="Modula3.html#whyswig">Why SWIG ?</a>
|
||||||
|
</ul>
|
||||||
<li><a href="Modula3.html#conception">Conception</a>
|
<li><a href="Modula3.html#conception">Conception</a>
|
||||||
<ul>
|
<ul>
|
||||||
<li><a href="Modula3.html#cinterface">Interfaces to C libraries</a>
|
<li><a href="Modula3.html#cinterface">Interfaces to C libraries</a>
|
||||||
<li><a href="Modula3.html#noplan">Interfaces to C++ libraries</a>
|
<li><a href="Modula3.html#cppinterface">Interfaces to C++ libraries</a>
|
||||||
<li><a href="Modula3.html#cppinterface">No plan?</a>
|
|
||||||
</ul>
|
</ul>
|
||||||
<li><a href="Modula3.html#preliminaries">Preliminaries</a>
|
<li><a href="Modula3.html#preliminaries">Preliminaries</a>
|
||||||
<ul>
|
<ul>
|
||||||
|
|
@ -660,10 +665,14 @@
|
||||||
<li><a href="Modula3.html#class">Objects</a>
|
<li><a href="Modula3.html#class">Objects</a>
|
||||||
<li><a href="Modula3.html#imports">Imports</a>
|
<li><a href="Modula3.html#imports">Imports</a>
|
||||||
<li><a href="Modula3.html#exceptions">Exceptions</a>
|
<li><a href="Modula3.html#exceptions">Exceptions</a>
|
||||||
<li><a href="Modula3.html#swig_pragmas">Pragmas</a>
|
|
||||||
<li><a href="Modula3.html#typemap_example">Example</a>
|
<li><a href="Modula3.html#typemap_example">Example</a>
|
||||||
<li><a href="Modula3.html#remarks">Remarks</a>
|
|
||||||
</ul>
|
</ul>
|
||||||
|
<li><a href="Modula3.html#hints">More hints to the generator</a>
|
||||||
|
<ul>
|
||||||
|
<li><a href="Modula3.html#features">Features</a>
|
||||||
|
<li><a href="Modula3.html#pragmas">Pragmas</a>
|
||||||
|
</ul>
|
||||||
|
<li><a href="Modula3.html#remarks">Remarks</a>
|
||||||
</ul>
|
</ul>
|
||||||
<!-- INDEX -->
|
<!-- INDEX -->
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -8,11 +8,16 @@
|
||||||
<!-- INDEX -->
|
<!-- INDEX -->
|
||||||
<ul>
|
<ul>
|
||||||
<li><a href="#modula3_overview">Overview</a>
|
<li><a href="#modula3_overview">Overview</a>
|
||||||
|
<ul>
|
||||||
|
<li><a href="#whyscripting">Why not scripting ?</a>
|
||||||
|
<li><a href="#whymodula3">Why Modula-3 ?</a>
|
||||||
|
<li><a href="#whycpp">Why C / C++ ?</a>
|
||||||
|
<li><a href="#whyswig">Why SWIG ?</a>
|
||||||
|
</ul>
|
||||||
<li><a href="#conception">Conception</a>
|
<li><a href="#conception">Conception</a>
|
||||||
<ul>
|
<ul>
|
||||||
<li><a href="#cinterface">Interfaces to C libraries</a>
|
<li><a href="#cinterface">Interfaces to C libraries</a>
|
||||||
<li><a href="#noplan">Interfaces to C++ libraries</a>
|
<li><a href="#cppinterface">Interfaces to C++ libraries</a>
|
||||||
<li><a href="#cppinterface">No plan?</a>
|
|
||||||
</ul>
|
</ul>
|
||||||
<li><a href="#preliminaries">Preliminaries</a>
|
<li><a href="#preliminaries">Preliminaries</a>
|
||||||
<ul>
|
<ul>
|
||||||
|
|
@ -26,10 +31,14 @@
|
||||||
<li><a href="#class">Objects</a>
|
<li><a href="#class">Objects</a>
|
||||||
<li><a href="#imports">Imports</a>
|
<li><a href="#imports">Imports</a>
|
||||||
<li><a href="#exceptions">Exceptions</a>
|
<li><a href="#exceptions">Exceptions</a>
|
||||||
<li><a href="#swig_pragmas">Pragmas</a>
|
|
||||||
<li><a href="#typemap_example">Example</a>
|
<li><a href="#typemap_example">Example</a>
|
||||||
<li><a href="#remarks">Remarks</a>
|
|
||||||
</ul>
|
</ul>
|
||||||
|
<li><a href="#hints">More hints to the generator</a>
|
||||||
|
<ul>
|
||||||
|
<li><a href="#features">Features</a>
|
||||||
|
<li><a href="#pragmas">Pragmas</a>
|
||||||
|
</ul>
|
||||||
|
<li><a href="#remarks">Remarks</a>
|
||||||
</ul>
|
</ul>
|
||||||
<!-- INDEX -->
|
<!-- INDEX -->
|
||||||
|
|
||||||
|
|
@ -40,7 +49,8 @@ This chapter describes SWIG's support of
|
||||||
You should be familiar with the
|
You should be familiar with the
|
||||||
<a href="SWIG.html#SWIG">basics</a>
|
<a href="SWIG.html#SWIG">basics</a>
|
||||||
of SWIG,
|
of SWIG,
|
||||||
especially typemaps.
|
especially
|
||||||
|
<a href="Typemaps.html">typemaps</a>.
|
||||||
|
|
||||||
<H2><a name="modula3_overview"></a>20.1 Overview</H2>
|
<H2><a name="modula3_overview"></a>20.1 Overview</H2>
|
||||||
|
|
||||||
|
|
@ -49,28 +59,31 @@ especially typemaps.
|
||||||
The Modula-3 support is very basic and highly experimental!
|
The Modula-3 support is very basic and highly experimental!
|
||||||
Many features are still not designed satisfyingly
|
Many features are still not designed satisfyingly
|
||||||
and I need more discussion about the odds and ends.
|
and I need more discussion about the odds and ends.
|
||||||
|
Don't rely on any feature, incompatible changes are likely in the future!
|
||||||
The Modula-3 generator was already useful for interfacing
|
The Modula-3 generator was already useful for interfacing
|
||||||
to the libraries
|
to the libraries
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
<ol>
|
||||||
|
<li>
|
||||||
<a href="http://www.elegosoft.com/cgi-bin/cvsweb.cgi/cm3/m3-libs/plplot/">
|
<a href="http://www.elegosoft.com/cgi-bin/cvsweb.cgi/cm3/m3-libs/plplot/">
|
||||||
PLPlot
|
PLPlot
|
||||||
</a>
|
</a>
|
||||||
and
|
</li>
|
||||||
|
<li>
|
||||||
<a href="http://www.elegosoft.com/cgi-bin/cvsweb.cgi/cm3/m3-libs/fftw/">
|
<a href="http://www.elegosoft.com/cgi-bin/cvsweb.cgi/cm3/m3-libs/fftw/">
|
||||||
FFTW
|
FFTW
|
||||||
</a>
|
</a> .
|
||||||
.
|
</li>
|
||||||
|
</ol>
|
||||||
<!--
|
|
||||||
<p>
|
|
||||||
The following introduction may help you
|
|
||||||
when you are uncertain about using
|
|
||||||
the Modula-3 support or SWIG at all.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
|
|
||||||
<a name="n3"></a><DISABLED>18.1.1 Why not scripting ?</DISABLED>
|
I took some more time to explain
|
||||||
|
why I think it's right what I'm doing.
|
||||||
|
So the introduction got a bit longer than it should ... ;-)
|
||||||
|
|
||||||
|
|
||||||
|
<H3><a name="whyscripting"></a>20.1.1 Why not scripting ?</H3>
|
||||||
|
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
|
|
@ -106,12 +119,12 @@ are not advantages of the language itself
|
||||||
but can be provided by function libraries.
|
but can be provided by function libraries.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<a name="n4"></a><DISABLED>18.1.2 Why Modula-3 ?</DISABLED>
|
<H3><a name="whymodula3"></a>20.1.2 Why Modula-3 ?</H3>
|
||||||
|
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
Modula-3 is a compiler language
|
Modula-3 is a compiler language
|
||||||
in the tradition of Niklas Wirth's Modula 2,
|
in the tradition of Niklaus Wirth's Modula 2,
|
||||||
which is in turn a successor of the popular Pascal.
|
which is in turn a successor of the popular Pascal.
|
||||||
I have chosen Modula-3
|
I have chosen Modula-3
|
||||||
because of its
|
because of its
|
||||||
|
|
@ -144,7 +157,7 @@ it's statically typed, too.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|
||||||
<a name="n5"></a><DISABLED>18.1.3 Why C / C++ ?</DISABLED>
|
<H3><a name="whycpp"></a>20.1.3 Why C / C++ ?</H3>
|
||||||
|
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
|
|
@ -157,7 +170,7 @@ Even more fortunately even non-C libraries may provide C header files.
|
||||||
This is where SWIG becomes helpful.
|
This is where SWIG becomes helpful.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<a name="n6"></a><DISABLED>18.1.4 Why SWIG ?</DISABLED>
|
<H3><a name="whyswig"></a>20.1.4 Why SWIG ?</H3>
|
||||||
|
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
|
|
@ -228,7 +241,7 @@ with Modula-3 (even with call back functions),
|
||||||
but it's certainly not possible to smoothly
|
but it's certainly not possible to smoothly
|
||||||
integrate Modula-3 code into a C / C++ project.
|
integrate Modula-3 code into a C / C++ project.
|
||||||
</p>
|
</p>
|
||||||
-->
|
|
||||||
|
|
||||||
<H2><a name="conception"></a>20.2 Conception</H2>
|
<H2><a name="conception"></a>20.2 Conception</H2>
|
||||||
|
|
||||||
|
|
@ -256,7 +269,7 @@ that SWIG puts together.
|
||||||
<tr>
|
<tr>
|
||||||
<td>Pragma <tt><* EXTERNAL *></tt></td>
|
<td>Pragma <tt><* EXTERNAL *></tt></td>
|
||||||
<td>Precedes a declaration of a PROCEDURE that is implemented
|
<td>Precedes a declaration of a PROCEDURE that is implemented
|
||||||
in an external library instead of a Modula-3 implemenation.</td>
|
in an external library instead of a Modula-3 module.</td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td>Pragma <tt><* CALLBACK *></tt></td>
|
<td>Pragma <tt><* CALLBACK *></tt></td>
|
||||||
|
|
@ -265,7 +278,7 @@ by external library code.</td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td>Module <tt>Ctypes</tt></td>
|
<td>Module <tt>Ctypes</tt></td>
|
||||||
<td>Contains Modula-3 types that match some basic C type.</td>
|
<td>Contains Modula-3 types that match some basic C types.</td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td>Module <tt>M3toC</tt></td>
|
<td>Module <tt>M3toC</tt></td>
|
||||||
|
|
@ -279,21 +292,30 @@ In each run of SWIG the Modula-3 part
|
||||||
generates several files:
|
generates several files:
|
||||||
</p>
|
</p>
|
||||||
<table border summary="Modula-3 generated files">
|
<table border summary="Modula-3 generated files">
|
||||||
|
<tr>
|
||||||
|
<th>Module name scheme</th>
|
||||||
|
<th>Identifier for <tt>%insert</tt></th>
|
||||||
|
<th>Description</th>
|
||||||
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td>Module<tt>Raw.i3</tt></td>
|
<td>Module<tt>Raw.i3</tt></td>
|
||||||
|
<td><tt>m3rawintf</tt></td>
|
||||||
<td>Declaration of types that are equivalent to those of the C library,
|
<td>Declaration of types that are equivalent to those of the C library,
|
||||||
<tt>EXTERNAL</tt> of the C library functions</td>
|
<tt>EXTERNAL</tt> procedures as interface to the C library functions</td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td>Module<tt>Raw.m3</tt></td>
|
<td>Module<tt>Raw.m3</tt></td>
|
||||||
|
<td><tt>m3rawimpl</tt></td>
|
||||||
<td>Almost empty.</td>
|
<td>Almost empty.</td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td>Module<tt>.i3</tt></td>
|
<td>Module<tt>.i3</tt></td>
|
||||||
|
<td><tt>m3wrapintf</tt></td>
|
||||||
<td>Declaration of comfortable wrappers to the C library functions.</td>
|
<td>Declaration of comfortable wrappers to the C library functions.</td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td>Module<tt>.m3</tt></td>
|
<td>Module<tt>.m3</tt></td>
|
||||||
|
<td><tt>m3wrapimpl</tt></td>
|
||||||
<td>Implementation of the wrappers that
|
<td>Implementation of the wrappers that
|
||||||
convert between Modula-3 and C types,
|
convert between Modula-3 and C types,
|
||||||
check for validity of values,
|
check for validity of values,
|
||||||
|
|
@ -301,6 +323,7 @@ generates several files:
|
||||||
and raises exceptions.</td>
|
and raises exceptions.</td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
|
<td><tt>m3makefile</tt></td>
|
||||||
<td><tt>m3makefile</tt></td>
|
<td><tt>m3makefile</tt></td>
|
||||||
<td>Add the modules above to the Modula-3 project and
|
<td>Add the modules above to the Modula-3 project and
|
||||||
specify the name of the Modula-3 wrapper library
|
specify the name of the Modula-3 wrapper library
|
||||||
|
|
@ -315,7 +338,7 @@ generates several files:
|
||||||
</table>
|
</table>
|
||||||
|
|
||||||
Here's a scheme of how the function calls to Modula-3 wrappers
|
Here's a scheme of how the function calls to Modula-3 wrappers
|
||||||
a redirected to C library functions:
|
are redirected to C library functions:
|
||||||
<table summary="Modula-3 C library">
|
<table summary="Modula-3 C library">
|
||||||
<tr>
|
<tr>
|
||||||
<td align=center>
|
<td align=center>
|
||||||
|
|
@ -349,7 +372,27 @@ a redirected to C library functions:
|
||||||
</table>
|
</table>
|
||||||
|
|
||||||
|
|
||||||
<H3><a name="noplan"></a>20.2.2 Interfaces to C++ libraries</H3>
|
<p>
|
||||||
|
I have still no good conception how one can split C library interfaces
|
||||||
|
into type oriented interfaces.
|
||||||
|
A Module in Modula-3 represents an Abstract DataType
|
||||||
|
(or call it a static classes, i.e. a class without virtual methods).
|
||||||
|
E.g. if you have a principal type, say <tt>Database</tt>,
|
||||||
|
it is good Modula-3 style to set up one Module with the name <tt>Database</tt>
|
||||||
|
where the database type is declared with the name <tt>T</tt>
|
||||||
|
and where all functions are declared that operates on it.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
The normal operation of SWIG is to generate a fixed set of files per call.
|
||||||
|
To generate multiple modules one has to write one SWIG interface
|
||||||
|
(different SWIG interfaces can share common data) per module.
|
||||||
|
Identifiers belonging to a different module may ignored (<tt>%ignore</tt>)
|
||||||
|
and the principal type must be renamed (<tt>%typemap</tt>).
|
||||||
|
</p>
|
||||||
|
|
||||||
|
|
||||||
|
<H3><a name="cppinterface"></a>20.2.2 Interfaces to C++ libraries</H3>
|
||||||
|
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
|
|
@ -404,7 +447,7 @@ Wrapping C++ libraries arises additional problems:
|
||||||
</p>
|
</p>
|
||||||
<ul>
|
<ul>
|
||||||
<li>
|
<li>
|
||||||
Is it sensible to wrap C++ class with Modula-3 classes?
|
Is it sensible to wrap C++ classes with Modula-3 classes?
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
How to find the wrapping Modula-3 class
|
How to find the wrapping Modula-3 class
|
||||||
|
|
@ -447,28 +490,6 @@ There is no C++ library I wrote a SWIG interface for,
|
||||||
so I'm not sure if this is possible or sensible, yet.
|
so I'm not sure if this is possible or sensible, yet.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<H3><a name="cppinterface"></a>20.2.3 No plan?</H3>
|
|
||||||
|
|
||||||
|
|
||||||
<p>
|
|
||||||
I have still no good conception how one can split C library interfaces
|
|
||||||
into type oriented interfaces.
|
|
||||||
I.e. if you have a principal type, say <tt>Database</tt>,
|
|
||||||
it is good Modula-3 style to set up one Module with the name <tt>Database</tt>
|
|
||||||
where the database type is declared with the name <tt>T</tt>
|
|
||||||
and where all functions are declared that operates on it.
|
|
||||||
Thus Modules in Modula-3 are a kind of static classes.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
The normal operation of SWIG is to generate a fixed set of files per call.
|
|
||||||
To generate multiple modules one has to write one SWIG interface
|
|
||||||
(different SWIG interfaces can share common data) per module.
|
|
||||||
Identifiers belonging to a different module may ignored (<tt>%ignore</tt>)
|
|
||||||
and the principal type must be renamed (<tt>%typemap</tt>).
|
|
||||||
</p>
|
|
||||||
|
|
||||||
|
|
||||||
<H2><a name="preliminaries"></a>20.3 Preliminaries</H2>
|
<H2><a name="preliminaries"></a>20.3 Preliminaries</H2>
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -481,7 +502,7 @@ SWIG itself does not contain compiler specific code
|
||||||
but the library file
|
but the library file
|
||||||
<a href="../../Lib/modula3/modula3.swg"><tt>modula3.swg</tt></a>
|
<a href="../../Lib/modula3/modula3.swg"><tt>modula3.swg</tt></a>
|
||||||
may do so.
|
may do so.
|
||||||
For testing examples I used Critical Mass cm3.
|
For testing examples I use Critical Mass cm3.
|
||||||
|
|
||||||
|
|
||||||
<H3><a name="commandline"></a>20.3.2 Additional Commandline Options</H3>
|
<H3><a name="commandline"></a>20.3.2 Additional Commandline Options</H3>
|
||||||
|
|
@ -492,13 +513,14 @@ that prevent SWIG from generating interface files.
|
||||||
Instead files are emitted that may assist you
|
Instead files are emitted that may assist you
|
||||||
when writing SWIG interface files.
|
when writing SWIG interface files.
|
||||||
|
|
||||||
<table summary="Modula-3 specific options">
|
<table border summary="Modula-3 specific options">
|
||||||
<tr>
|
<tr>
|
||||||
<th>Modula-3 specific options</th>
|
<th>Modula-3 specific options</th>
|
||||||
|
<th>Description</th>
|
||||||
</tr>
|
</tr>
|
||||||
|
|
||||||
<tr>
|
<tr>
|
||||||
<td>-generateconst <file></td>
|
<td valign=top>-generateconst <file></td>
|
||||||
<td>
|
<td>
|
||||||
Disable generation of interfaces and wrappers.
|
Disable generation of interfaces and wrappers.
|
||||||
Instead write code for computing numeric values of constants
|
Instead write code for computing numeric values of constants
|
||||||
|
|
@ -513,7 +535,7 @@ All of them can invoke C code dynamically
|
||||||
for computing the macro values.
|
for computing the macro values.
|
||||||
But if one wants to turn them into Modula-3
|
But if one wants to turn them into Modula-3
|
||||||
integer constants, enumerations or set types,
|
integer constants, enumerations or set types,
|
||||||
the value of these expressions has to be known statically.
|
the values of these expressions has to be known statically.
|
||||||
Although definitions like <tt>(1 << FLAG_MAXIMIZEWINDOW)</tt>
|
Although definitions like <tt>(1 << FLAG_MAXIMIZEWINDOW)</tt>
|
||||||
must be considered as good C style
|
must be considered as good C style
|
||||||
they are hard to convert to Modula-3
|
they are hard to convert to Modula-3
|
||||||
|
|
@ -523,16 +545,16 @@ Thus I implemented these switch
|
||||||
to extract all constant definitions
|
to extract all constant definitions
|
||||||
and write a C program that output the values of them.
|
and write a C program that output the values of them.
|
||||||
It works for numeric constants only
|
It works for numeric constants only
|
||||||
and treats all of them as double.
|
and treats all of them as <tt>double</tt>.
|
||||||
Future versions may generate a C++ program
|
Future versions may generate a C++ program
|
||||||
that can detect the type of the macros
|
that can detect the type of the macros
|
||||||
by overloaded output functions.
|
by overloaded output functions.
|
||||||
Then strings can also be processable.
|
Then strings can also be processed.
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
|
|
||||||
<tr>
|
<tr>
|
||||||
<td>-generaterename <file></td>
|
<td valign=top>-generaterename <file></td>
|
||||||
<td>
|
<td>
|
||||||
Disable generation of interfaces and wrappers.
|
Disable generation of interfaces and wrappers.
|
||||||
Instead generate suggestions for <tt>%rename</tt>.
|
Instead generate suggestions for <tt>%rename</tt>.
|
||||||
|
|
@ -550,7 +572,7 @@ with a name suggestion generated by a simple heuristic.
|
||||||
</tr>
|
</tr>
|
||||||
|
|
||||||
<tr>
|
<tr>
|
||||||
<td>-generatetypemap <file></td>
|
<td valign=top>-generatetypemap <file></td>
|
||||||
<td>
|
<td>
|
||||||
Disable generation of interfaces and wrappers.
|
Disable generation of interfaces and wrappers.
|
||||||
Instead generate templates for some basic typemaps.
|
Instead generate templates for some basic typemaps.
|
||||||
|
|
@ -573,11 +595,21 @@ the function value.
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
Each C type can have several typemaps
|
Each C type can have several typemaps
|
||||||
that apply only in case the types are used
|
that apply only in case if a type is used
|
||||||
as input argument, as output argument,
|
for an input argument, for an output argument,
|
||||||
or as return value.
|
or for a return value.
|
||||||
A further typemap may specify
|
A further typemap may specify
|
||||||
the direction that is used for certain parameters.
|
the direction that is used for certain parameters.
|
||||||
|
I have chosen this separation
|
||||||
|
in order to be able to write general typemaps for the typemap library
|
||||||
|
<a href="../../Lib/modula3/modula3.swg"><tt>modula3.swg</tt></a>
|
||||||
|
.
|
||||||
|
In the library code the final usage of the type is not known.
|
||||||
|
Using separate typemaps for each possible use
|
||||||
|
allows appropriate definitions for each case.
|
||||||
|
If these pre-definitions are fine
|
||||||
|
then the direction of the function parameter
|
||||||
|
is the only hint the user must give.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
|
|
@ -585,7 +617,7 @@ The typemaps specific to Modula-3 have a common name scheme:
|
||||||
A typemap name starts with "m3",
|
A typemap name starts with "m3",
|
||||||
followed by "raw" or "wrap"
|
followed by "raw" or "wrap"
|
||||||
depending on whether it controls the generation
|
depending on whether it controls the generation
|
||||||
of the Module<tt>.i3</tt> or the Module<tt>Raw.i3</tt>, respectively.
|
of the Module<tt>Raw.i3</tt> or the Module<tt>.i3</tt>, respectively.
|
||||||
It follows an "in" for typemaps applied to input argument,
|
It follows an "in" for typemaps applied to input argument,
|
||||||
"out" for output arguments, "arg" for all kind of arguments,
|
"out" for output arguments, "arg" for all kind of arguments,
|
||||||
"ret" for returned values.
|
"ret" for returned values.
|
||||||
|
|
@ -763,9 +795,56 @@ consist of the following parts:
|
||||||
<H3><a name="ordinals"></a>20.4.2 Subranges, Enumerations, Sets</H3>
|
<H3><a name="ordinals"></a>20.4.2 Subranges, Enumerations, Sets</H3>
|
||||||
|
|
||||||
|
|
||||||
|
Subranges, enumerations, and sets are machine oriented types
|
||||||
|
that make Modula very strong and expressive compared
|
||||||
|
with the type systems of many other languages.
|
||||||
|
<ul>
|
||||||
|
<li>
|
||||||
|
Subranges are used for statically restricted choices of integers.
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
Enumerations are used for named choices.
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
Sets are commonly used for flag (option) sets.
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
Using them extensively makes Modula code very safe and readable.
|
||||||
|
|
||||||
|
C supports enumerations, too, but they are not as safe as the ones of Modula.
|
||||||
|
Thus they are abused for many things:
|
||||||
|
For named choices, for integer constant definitions, for sets.
|
||||||
|
To make it complete every way of defining a value in C
|
||||||
|
(<tt>#define</tt>, <tt>const int</tt>, <tt>enum</tt>)
|
||||||
|
is somewhere used for defining something
|
||||||
|
that must be handled completely different in Modula-3
|
||||||
|
(<tt>INTEGER</tt>, enumeration, <tt>SET</tt>).
|
||||||
|
|
||||||
|
I played around with several <tt>%feature</tt>s and <tt>%pragma</tt>s
|
||||||
|
that split the task up into converting
|
||||||
|
the C bit patterns (integer or bit set)
|
||||||
|
into Modula-3 bit patterns (integer or bit set)
|
||||||
|
and change the type as requested.
|
||||||
|
See the corresponding
|
||||||
|
<a href="../../Examples/modula3/enum/example.i">example</a>.
|
||||||
|
This is quite messy and not satisfying.
|
||||||
|
So the best what you can currently do is
|
||||||
|
to rewrite constant definitions manually.
|
||||||
|
Though this is a tedious work
|
||||||
|
that I'd like to automate.
|
||||||
|
|
||||||
|
|
||||||
<H3><a name="class"></a>20.4.3 Objects</H3>
|
<H3><a name="class"></a>20.4.3 Objects</H3>
|
||||||
|
|
||||||
|
|
||||||
|
Declarations of C++ classes are mapped to <tt>OBJECT</tt> types
|
||||||
|
while it is tried to retain the access hierarchy
|
||||||
|
"public - protected - private" using partial revelation.
|
||||||
|
Though the
|
||||||
|
<a href="../../Examples/modula3/class/example.i">implementation</a>
|
||||||
|
is not really useful, yet.
|
||||||
|
|
||||||
|
|
||||||
<H3><a name="imports"></a>20.4.4 Imports</H3>
|
<H3><a name="imports"></a>20.4.4 Imports</H3>
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -808,34 +887,16 @@ of an output of a function: exceptions.
|
||||||
Any piece of Modula-3 code that SWIG inserts
|
Any piece of Modula-3 code that SWIG inserts
|
||||||
due to a typemap can raise an exception.
|
due to a typemap can raise an exception.
|
||||||
This way you can also convert an error code
|
This way you can also convert an error code
|
||||||
from a C function into an Modula-3 exception.
|
from a C function into a Modula-3 exception.
|
||||||
|
|
||||||
The <tt>RAISES</tt> clause is controlled
|
The <tt>RAISES</tt> clause is controlled
|
||||||
by typemaps with the <tt>except</tt> extension.
|
by typemaps with the <tt>throws</tt> extension.
|
||||||
If the typemap <tt>m3wrapinconv</tt> for <tt>blah *</tt>
|
If the typemap <tt>m3wrapinconv</tt> for <tt>blah *</tt>
|
||||||
contains code that may raise the exceptions <tt>OSError.E</tt>
|
contains code that may raise the exceptions <tt>OSError.E</tt>
|
||||||
you should declare
|
you should declare
|
||||||
<tt>%typemap("m3wrapinconv:throws") blah * %{OSError.E%}</tt>.
|
<tt>%typemap("m3wrapinconv:throws") blah * %{OSError.E%}</tt>.
|
||||||
|
|
||||||
<H3><a name="swig_pragmas"></a>20.4.6 Pragmas</H3>
|
<H3><a name="typemap_example"></a>20.4.6 Example</H3>
|
||||||
|
|
||||||
|
|
||||||
<table border summary="Modula-3 pragmas">
|
|
||||||
<tr>
|
|
||||||
<td>unsafe</td>
|
|
||||||
<td><tt>%pragma(modula3) unsafe="true";</tt></td>
|
|
||||||
<td>Mark the raw interface modules as <tt>UNSAFE</tt>.
|
|
||||||
This will be necessary in many cases.</td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td>library</td>
|
|
||||||
<td><tt>%pragma(modula3) library="m3fftw";</tt></td>
|
|
||||||
<td>Specifies the library name for the wrapper library to be created.
|
|
||||||
It should be distinct from the name of the library to be wrapped.</td>
|
|
||||||
</tr>
|
|
||||||
</table>
|
|
||||||
|
|
||||||
<H3><a name="typemap_example"></a>20.4.7 Example</H3>
|
|
||||||
|
|
||||||
|
|
||||||
The generation of wrappers in Modula-3 needs very fine control
|
The generation of wrappers in Modula-3 needs very fine control
|
||||||
|
|
@ -877,7 +938,71 @@ where almost everything is generated by a typemap:
|
||||||
END Name;
|
END Name;
|
||||||
</pre></blockquote>
|
</pre></blockquote>
|
||||||
|
|
||||||
<H3><a name="remarks"></a>20.4.8 Remarks</H3>
|
|
||||||
|
<H2><a name="hints"></a>20.5 More hints to the generator</H2>
|
||||||
|
|
||||||
|
|
||||||
|
<H3><a name="features"></a>20.5.1 Features</H3>
|
||||||
|
|
||||||
|
|
||||||
|
<table border summary="Modula-3 features">
|
||||||
|
<tr>
|
||||||
|
<th>Feature</th>
|
||||||
|
<th>Example</th>
|
||||||
|
<th>Description</th>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>multiretval</td>
|
||||||
|
<td><tt>%m3multiretval get_box;</tt> or
|
||||||
|
<tt>%feature("modula3:multiretval") get_box;</tt></td>
|
||||||
|
<td>Let the denoted function return a <tt>RECORD</tt>
|
||||||
|
rather than a plain value.
|
||||||
|
This <tt>RECORD</tt> contains all arguments with "out" direction
|
||||||
|
including the return value of the C function (if there is one).
|
||||||
|
If more than one argument is "out"
|
||||||
|
then the function <b>must</b> have the <tt>multiretval</tt> feature activated,
|
||||||
|
but it is explicitly requested from the user to prevent mistakes.</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>constnumeric</td>
|
||||||
|
<td><tt>%constnumeric(12) twelve;</tt> or
|
||||||
|
<tt>%feature("constnumeric","12") twelve;</tt></td>
|
||||||
|
<td>This feature can be used to tell Modula-3's back-end of SWIG
|
||||||
|
the value of an identifier.
|
||||||
|
This is necessary in the cases
|
||||||
|
where it was defined by a non-trivial C expression.
|
||||||
|
This feature is used by the
|
||||||
|
<tt>-generateconst</tt> <a href="#options">option</a>.
|
||||||
|
In future it may be generalized to other kind of values
|
||||||
|
such as strings.
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
|
||||||
|
<H3><a name="pragmas"></a>20.5.2 Pragmas</H3>
|
||||||
|
|
||||||
|
|
||||||
|
<table border summary="Modula-3 pragmas">
|
||||||
|
<tr>
|
||||||
|
<th>Pragma</th>
|
||||||
|
<th>Example</th>
|
||||||
|
<th>Description</th>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>unsafe</td>
|
||||||
|
<td><tt>%pragma(modula3) unsafe="true";</tt></td>
|
||||||
|
<td>Mark the raw interface modules as <tt>UNSAFE</tt>.
|
||||||
|
This will be necessary in many cases.</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>library</td>
|
||||||
|
<td><tt>%pragma(modula3) library="m3fftw";</tt></td>
|
||||||
|
<td>Specifies the library name for the wrapper library to be created.
|
||||||
|
It should be distinct from the name of the library to be wrapped.</td>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
|
||||||
|
<H2><a name="remarks"></a>20.6 Remarks</H2>
|
||||||
|
|
||||||
|
|
||||||
<ul>
|
<ul>
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue