Unions, anon Structure, fixed-length Strings
Community Forums/Monkey2 Talk/Unions, anon Structure, fixed-length Strings| 
 | ||
| Will MX2 support Unions within Structures? Anonymous Structures within Structures? Fixed-Length Strings (in Structure fields)? typedef struct _something {
    char name[100];    // fixed-length string
    long version;
    union {            // union
        struct {       // anonymous structure
            short a;
            short b;
            short c;
        };
        struct {
            long l1;
            long l2;
        };
        long long q;
    };
    short x;
    short y;
} SOMETHING;Structure Something
    name:String{100}    // fixed-length string
    version:Int
    Union               // union
        Structure       // anonymous structure
            a:Short
            b:Short
            c:Short
        End Structure
        Structure
            l1:Int
            l2:Int
        End
        q:Quad
    EndUnion
    x:Short
    y:Short
EndStructure | 
| 
 | ||
| I hope we will get something easy like javascript/php: 
 Local test = {}
 test.a = "bla"
 test['b'] = "bla"
 test.c = 1
 test.d = aObjectRef
 foreach(test as key=>val){
   if(typeof(test[key]) = string){
     print test[key]
   }
 }
 print test.a
 print test.c+1
 method bla(){
    local test2 = {}
    test2.a = 1
    test2.b = 2
    return test2
 }
 Local test3 = bla()
 Local test4:Int = bla().a
Just typing the code, and not defining everything. | 
| 
 | ||
| Probably not, in a strict type-safe language. But you can use Maps already: Import Map
Function bla:StringMap<Int>()
    Local test2:= New StringMap<Int>()
    test2.Add("a", 1)
    test2.Add("b", 2)
    return test2
End
Function Main()
    Local test:StringMap<Object> = New StringMap<Object>()
    test.Add("a", BoxString("bla"))
    test.Add("b", BoxString("bla"))
    test.Add("c", BoxInt(1))
    For Local key:= EachIn test.Keys
        Print key
    Next
    Print UnboxString(test.Get("a"))
    Print UnboxInt(test.Get("c")) + 1
    Local test4:Int = bla().Get("a")
    Print test4
EndSizeOf(), TypeOf(), InstanceOf() seems to be missing, though. Maybe possible using reflection. SizeOf() is also often required to init a structure member with SizeOf(Structure) in external API's, and to check SizeOf(Int) on different platforms (32/64bit). | 
| 
 | ||
| Some kind of operator overloading would be cool, though. So map.Add("a", 1)
x := map.Get("a")could become map["a"] = 1 x := map["a"] Especially operator overloading for [] and () allows many nice shortcuts. Dunno if emscripten supports this... Local test2 := New StringMap<Int>()
test2["x"] = 1 ' ERROR: Cannot convert from String to Int.
test2("x") = 1 ' ERROR: Identifier 'test2' not found.Already wondered about this errors today, until I realized that we have to use Add/Get explicitely. ;) | 
| 
 | ||
| Operator overloading would be really nice. 
foo["bar"] = 123   -->   foo.Set(123)
Print foo["bar"]   -->   Print foo.Get("bar")
foo("bar")         -->   foo.Invoke("bar")
In this topic I made a suggestion for operator overloading and it looks like Mark will implement it in Monkey2. |