On Fri, 2007-01-12 at 13:28 -0800, Erick Tryzelaar wrote:
> Could we do:
>
> namespace foo::bar[t]::baz[u where u = t + 1] { ...
>
> ?
This should work now, a bit painful, but almost everything
is converted. Known exceptions:
* parallel initialisations
var X::a,Y::b,Z::c = 1,2,3; // and the val case
doesn't work. This is a parallel assignment, it probably doesn't
make sense to split it up into three separately sequenced assignments.
This makes sense:
var X::(a,b,c) = 1,2,3;
but isn't implemented. This include 'val' and 'def'.
* class members
Doesn't make sense unless we define a kind of 'open' class:
classes, like modules, are conceptually closed .. after all
that's "encapsulation" .. :)
* procedure assignment
var &x : int <- read 1;
This is a hack. No we can't used generators here, "read" has to
be a procedure because it's a fibre. This needs to be cleaned up.
//////////////////////////////////////////////////////////////////////////
Red Herring: it is tempting to convert Felix functions to procedures
universally to get rid of this problem: we could use CPS transform
to do that. The issues is that most functions are *already* converted
to procedural code by the simple act of inlining them. I think CPS
would actually make inlining harder, because 'the rest of the function'
is passed as an argument .. that is, a closure .. and closure
elimination is tricky. But I don't know.
In a PURE version of Felix .. one which doesn't pander so much to
C/C++ object and execution model, we'd probably do this. In such
a system there's no problem calling C functions from the system:
the problem is it doesn't support C calling Felix. This is already
the case for fibres however, since they're continuations.
The only way to implement that properly would require
hardware/C stack swapping. This can be done now .. entirely
portably .. using pthreads.
////////////////////////////////////////////////////////////////////////
Anyhow the bottom line is you can now write code like:
fun X::f()=>x;
var X::X = 1;
namespace X { print$ f(); endl; }
and expect it to work. Note the cute trick:
var Seq1::x = 1;
var Seq2::x = 1;
var Seq1::y = x;
var Seq2::y = y;
BE WARNED! This means:
namespace Seq1 { x = 1; y = x; }
namespace Seq2 { x = 1; y = x; }
in particular ALL THE CODE in the statement is executed in
the scope of the namespace. This is the SAME as C++ class member
definitions:
T X::f(x:U){ .. }
except that C++ has a wart: the 'T' is elaborated in the current scope,
whereas the U is elaborated in the scope X.
However it is surprising you don't have to write:
var Seq2::y = Seq2::x;
.. well it surprised me anyhow .. :)
--
John Skaller <skaller at users dot sf dot net>
Felix, successor to C++: http://felix.sf.net
-------------------------------------------------------------------------
Take Surveys. Earn Cash. Influence the Future of IT
Join SourceForge.net's Techsay panel and you'll get the chance to share your
opinions on IT & business topics through brief surveys - and earn cash
http://www.techsay.com/default.php?page=join.php&p=sourceforge&CID=DEVDEV
_______________________________________________
Felix-language mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/felix-language