Page 1 of 2

Translating stuff to Cobra

PostPosted: Sun Aug 29, 2010 8:25 am
by gradha
Well, I figured out that if it is taking me ages to write a serious program because something always gets in the way, I could at least start coding small snippets of code. So I started to translate C# code to Cobra to help me familiarize with the language and learn both. I'll be slowly publishing the stuff at

Keep up the good work. From all the languages I have at hand now, Cobra is the only one that slurrs to my ear "My preciousss... er, code something in it, dammit!". And now, going back to Starcraft 2 (yes, that's what in the way right now).

Re: Translating stuff to Cobra

PostPosted: Sun Aug 29, 2010 9:34 am
by Charles
Thanks for your interest in Cobra. Poking around github, it looks you're going to do a series of tutorials translated from C# to Cobra which will be great. For tips on porting, we have a Porting From C# wiki page that will help you. And feel free to update it if you like.

Re: Translating stuff to Cobra

PostPosted: Sun Aug 29, 2010 11:14 am
by gradha
Wow, looks like the simple array example is proving hard to translate. From I see arrays are unexplored territory. I'm unable to replicate the following in Cobra:
Code: Select all
// Array-of-arrays (jagged array)
byte[][] scores = new byte[5][];

Given that multidimensional array don't seem supported, how do you create a fixed size array of arrays? I've tried:
Code: Select all
x = [](5)
x = (uint8[])[](5)
x = Array<of uint8[]>

EDIT: Ok, my best attempt at ... %20Arrays/, really ugly.

Re: Translating stuff to Cobra

PostPosted: Mon Aug 30, 2010 6:29 am
by hopscc
Theres no direct support for jagged and multidimensional arrays in cobra yet ( search forum for 'arrays' and 'jagged') - only cos its not been needed or asked for.

With the current cobra code the problem is that you cant provide a combination type description (using multiple '[]' and typenames) meaning array-of arrays that cobra will accept ( well I couldnt at least)
so you have to finesse it a little and let it work it out without explicitly telling it using a combination of partial declarations and initialisations (clumsy but possible)
heres the grind for a 2D array
Code: Select all
    # these are the array lines
    a = int[](10)
    b = int[](10)
    #This is the 2D array
    arr = @[a,b]  # initialised to an array literal composed of the array lines
    print arr.typeOf  #    System.Int32[][]
    arr[0][0] = 9
    print arr[0][0]
    print arr[0][1]

I suspect you could do this rolling your own by defining a type (even genericised)that acts like an array ( is indexable - eg ArrOfInt) and declaring an array of that type but thats even more tedious..
Code: Select all
class ArrOfInt
    var _ray  as int[]
    cue ini (size as int)
        _ray = int[](size)

    pro [index as int]
            return _ray[index]
            _ray[index] = value
    # ...


    arr as ArrOfInt[] = ArrOfInt[](2)(10) # ??? or ArrOfInt[](10)[](2) ???
   arr[0][0] = 9


If you reallly really would like 2D ( or more ) arrays supported directly open a ticket for it.

Re: Translating stuff to Cobra

PostPosted: Mon Aug 30, 2010 2:32 pm
by gradha
No need to have. I can see having multidimensional or jagged arrays is more useful for graphic-related operations but I won't be doing anything like that soon. Besides, I'm used to faking it with simple arrays anyway.

Re: Translating stuff to Cobra

PostPosted: Fri Sep 03, 2010 6:46 am
by hopscc
Does anyone see any utility at all in having (very minimal) cobra support for multidimensional and jagged arrays ??
The issue seems to be providing the type explicitly that cobra can recognise and deref as an array correctly

Given that I've got working an experimental tweak/hack/excresence to the cobra compiler so that it will recognise such types (2 and 3D only) but
to construct them you have to drop down into sharp''
everything else seems to just work :)
Code: Select all
    def jagged
        arr as int[][] = sharp'new int[2][]'  # workable dcl - 2D jagged array
        arr[0], arr[1]  = int[](10), int[](6)
        assert arr.typeOf.toString == r'System.Int32[][]'
        arr[0][0] = 9
        assert arr[0][0] == 9
        assert arr[0][1] == 0
        print arr
    def multiDimen
        arr as int[,] = sharp'new int[2,10]'  # 2D multidimensional array (Matrix)
        assert arr.typeOf.toString == r'System.Int32[,]'
        arr[0,0] = 9
        assert arr[0,0] == 9
        assert arr[0,1] == 0
        arr[1,0] = 10
        assert arr[1,0] == 10
        print arr
        arr3D as int[,,] = sharp'new int[2,2,2]'  # 3D Multidimensional array (Cubix)
        assert arr3D.typeOf.toString == r'System.Int32[,,]'
        arr3D[0,0,0] = 9
        assert arr3D[0,0,0] == 9
        assert arr3D[0,0,1] == 0
        arr3D[0,1,0] = 10
        assert arr3D[0,1,0] == 10
        arr3D[1,1,1] = 111
        assert arr3D[1,1,1] == 111

Is it worthwhile supplying this as a proper patch???

Re: Translating stuff to Cobra

PostPosted: Fri Sep 03, 2010 9:35 am
by Charles
I think it is.

Re: Translating stuff to Cobra

PostPosted: Sat Sep 04, 2010 2:59 am
by hopscc
New ticket and patch coming at ya.

Re: Translating stuff to Cobra

PostPosted: Sat Sep 04, 2010 6:21 am
by hopscc
See ticket:253. patch uploaded.

Just to clarify/repeat what this gives us:
-- Syntax for a multidimension or jagged array Type (similar to the existing single dimension array type)
-- such arrays may be 2 or 3 Dimensions only - trying to specify additional dimensions will get you an obscure error message at compilation.
-- such arrays can be constructed with a fallthrough to sharp'' (per example above) or using the literal array example earlier (jagged only) - theres no additional creation support
-- jagged array types are declared
Code: Select all
  TYPE[][] or TYPE[][][] 
  String[size][]    # 2D jagged String array uninitialised
  Decimal[2][3][] # 3D jagged Decimal Array uninitialised

-- multidimensional array types are declared
Code: Select all
 TYPE[,]   TYPE[,,]
  String[,] # 2D String array
  File[,,]   # 3 Dimension array of File

-- thats it

Post this patch, gradhas tutorial example can be now done
Code: Select all
class DeclareArraysSample
        def main
                # Single-dimensional array
                numbers = int[](5)

                # Multidimensional arrays are minimally supported in Cobra. Use sharp for construction
                names as String[,]= sharp'new string[5, 4]' # 2D string array, all nil
                #print names

                # Array-of-arrays (jagged array)
                scores as uint8[][]= sharp'new byte[5][]'  # 2D jagged byte/uint8  array
                # Create the jagged or nested array.
                for i in scores.length
                        scores[i] = uint8[](i + 3)

                for i in scores.length
                        print "Length of row [i] is [scores[i].length]"

Re: Translating stuff to Cobra

PostPosted: Wed Nov 03, 2010 7:29 pm
by torial
I just tried applying the latest release (10-18-10) to get the multidimensional support (I'm doing a test run port of something from boo to Cobra), and am perplexed.

My code is as follows:
Code: Select all
class Figure
   pro matr from var as int[,]

But I get the error :<path>\Tetris.cobra(13,27): error: Expecting RBRACKET, but got "," (COMMA) instead.

Am I using the right syntax? Or perhaps the new version of Cobra didn't take (not sure how to figure out which version I have, since it just says 0.8.0 post-release). I don't think it is the use of properties, as when I removed them, I still got the error.