On Tue, 2007-07-17 at 11:13 +1000, skaller wrote:
> On Mon, 2007-07-16 at 16:40 -0700, Raoul Duke wrote:
> First make a binding like:
Now I'll give some explanation, because this uses
quite a lot of features :)
> ///////////// foobind.flx ///////////////////////
> #import <flx.flxh>
> header foo_h = '#include "Foo.h"';
This tags a header inclusion. The quoted text will be
emitted into a generated *.hpp file if the tag foo_h is
activated.
> type foo = "Foo*" requires foo_h, package "foo";
This makes Felix type foo a pointer to a Foo object.
So 'foo' is a first class value itself, but it is
passing around a pointer to the underlying class.
The requires clause says "if the type 'foo' is used
anywhere in the program, then:
requires foo_h causes Felix to emit foo_h text into *.hpp
requires package "foo" causes Felix to emit "foo" into
*.resh, the resource file for the program.
The resh file lists all the external resources needed by
a program. It is just a list of resource names. These
resources are located by flx_pkgconfig by, for example:
config/foo.fpc
which provides the platform specific resource details
See below for the foo.fpc file.
The idea here is that Felix can find all the libraries
you need to run a program without any command line
switches. The description of the resource is split
into an abstract, platform independent resource,
the word 'foo', and a platform specific description,
the file config/foo.fpc.
> gen _ctor_foo: int -> foo = "new Foo($1)";
Two tricks here. First, Felix functions aren't allowed
to have side-effects .. but creating an object is a side-effect.
So instead of 'fun' we use 'gen' which is short for generator,
meaning the function has state and may have side-effects.
Generators are treated like functions except they're replaced
in expressions, for example:
f(g x, y) // where g is a generator
is replaced by
var tmp = g x;
f(tmp, y);
to ensure optimisations etc execute the generators serially
and exactly once.
The second trick here is the magic name _ctor_foo. A function
with such a name is invoked by 'foo' not _ctor_foo, where
foo is a typename .. _ctor_ is just shorthand for 'constructor'.
So this is how you write a constructor wrapper: you name it
_ctor_type where 'type' is the name of the type.
> proc del: foo = "delete $1;";
So we can delete a foo. $1 is the first and only
argument.
> fun getID: foo -> int = $1.getId()";
a wrapper for the getID() method,
$1 is the first and only argument.
> /////// foobar.flx /////////////////
> #import <flx.flxh>
> include "foobind";
This 'includes' the binding code we made above.
Doing it this way uses a cached parse tree for foobind,
which is named 'foobind.par'. If there's no such file,
Felix creates it after parsing foobind.flx recursively.
> proc flx_main()
A little known fact about Felix .. flx_main() is the name
of the mainline of the program. Usually we don't bother
we just use initialisation side-effects to write programs.
> and put this config for Unix:
>
> //// config/foo.fpc /////////////////
> provides_dlib: -lfoo_dynamic
> provides_slib: -lfoo_static
> //////////////////////////////////////
This is the resource descriptor file.
It says that to use the shared library for 'foo',
use the linker switch -lfoo_dynamic.
To do static linkage, use the linker switch -lfoo_static.
YMMV, these switches are platform dependent: depend on
your OS, where you put the libraries, and the compiler
used to link them.
> Now you need to remove (or rename) the 'main'
> function in Foo.cpp, then compile something like
> (RTFM here .. ):
>
> g++ -fPIC -shared -o rtl/foo_dynamic.so foo.cpp
> g++ -o rtl/foo_static.o foo.cpp
> ranlib -o rtl/foo_static.a rtl/foo_static.o
Ahem .. WOOPS .. on Unix the -o should be
-o rtl/libfoo_dynamic.so
since UNix is utterly stupid and puts 'lib' in front
of library names when searching.
--
John Skaller <skaller at users dot sf dot net>
Felix, successor to C++: http://felix.sf.net
-------------------------------------------------------------------------
This SF.net email is sponsored by DB2 Express
Download DB2 Express C - the FREE version of DB2 express and take
control of your XML. No limits. Just data. Click to get it now.
http://sourceforge.net/powerbar/db2/
_______________________________________________
Felix-language mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/felix-language