====== io ======
Io ist quasi die Factory für Ein-Ausgabefunktionen.
Point contains x, y is double;
p is Point( 1., 2. );
file is io( "json://test.test" );
file << p; // schreibt "{ 1., 2. }" in die Datei.
q is Point;
file.rewind();
file >> q; // Lädt den Punkt wieder ein.
Von io kann man ableiten:
json is io( "json" ) // Konstruktor gilt für alle
is file // muss noch konstruiert werden oder default
contains
{
operator persistent is int; // erkärt, dass persistent-Objekte, ein int enthalten muss. Ein Persistent Objekt enthält zwei Zeiger: Zum io Objekt und zu einem beliebigen Objekt (void *) oder - sofern es passt, wie int
Filename is string;
construct( Filename ) := file( Filename );
operator <<( rhs is reflected ) as this
{
file << "{ ";
rhs.isPrimitive() then
{
file << "{ \n";
rhs@{}.
{
index? then print ",\n";
file << " " << item.value( rhs ); // item ist vom Typ Point@ wenn Point als rhs übergeben wurde. Point@.value( xx) erwartet ein Point. rhs ist Point => passt.
}
file << "\n}\n";
}
// return this; // nicht erforderlich, steht ja schon da (as this)
}
operator <<( rhs is persistent reflected ) as this
{
.. wie oben, aber rhs hat ein UserData-Zeiger (persistent) für existiert.
existing is unsigned int : persistent( rhs ); // persistent() geht innerhalb von io und prüft, ob das Userdata überhaupt passt
}
}
===== reflect =====
Mit [[notes:reflect:]] lassen sich - je nach Datenquelle - Typen erstellen.
db is io("mysql://localhost/")
string [] dbs = db.ls();
print[] (dbs, ", "); // ( db1, db2, dbname, )
db.cd( "dbname" );
string[] tables = db.ls();
Point contains x, y is double persist mysql;
db.create( type Point ); // Legt eine Datenbank "Point" mit drei Spalten an: "_id" (AUTOINCREMENT), "x", "y"
print desc Point; // Point is struct ( 16 Bytes, 2 Member )
p is Point : ( 1, 2 );
index is int : db{ "Point" } << p; // Legt einen neuen Datensatz an
pp is persistent Point; // Ableitung von Point und ein UserData Zeiger, der dem jeweiligen io-Objekt (inkl. Position) zur Verfügung steht
pp << db{ index };
pp << db{ "x == 1" };
Man kann auch ganze Datenbanken in den Speicher holen:
db.cd( "/dbname" );
Points is something << db;
print desc Points; // int -> persistent Point (hash)
p is ref Point : Points{ 1 };
p.y = 4711;
p >> db; // p ist referenz, die Referenz wird zur Datenbank aktualisiert (UPDATE)
Reflektierte Typen können benutzt werden, um COde zu generieren.
db is io("mysql://localhost/dbname/Points")
type table : db.reflect();
emit table;
Ergibt
Point contains
{
x is double;
y is double;
default is persistant: // default ist ein Array und wird für mysql beschrieben.
{
mysql( "Point" ):
{
x -> "x",
y -> "y"
};
};
};