====== 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" }; }; };