Multidimensional arrays

Multidimensional arrays can be defined as:

var A = [
          [1, 2],
          [3, 4],
          [5, 6],
          [7, 8],
        ]

var B = [
          [1, 2, 3],
          [4, 5, 6],
        ]

In Sidef, we have the Array.wise_op() method, which takes two arbitrary nested arrays and an operator, folding each element (entrywise) with the provided operator, which is also available as a ~Wop b:

say ([1,2,[3,[4]]] ~W+ [42,43,[44,[45]]])       #=> [43, 45, [47, [49]]]

Alternatively:

say wise_op([1,2,[3,[4]]], '+', [42,43,[44,[45]]])   #=> [43, 45, [47, [49]]]

Scalar operations:

A `scalar_add` 42   # scalar addition       (aliased as `sadd`)
A `scalar_sub` 42   # scalar subtraction    (aliased as `ssub`)
A `scalar_mul` 42   # scalar multiplication (aliased as `smul`)
A `scalar_div` 42   # scalar division       (aliased as `sdiv`)

This methods are provided by Array.scalar_op(), which, just like Array.wise_op(), also supports arbitrary nested arrays:

say ([1,2,[3,[4]]] ~S+ 42)   #=> [43, 44, [45,  [46]]]
say ([1,2,[3,[4]]] ~S* 42)   #=> [42, 84, [126, [168]]]

...which is equivalent with:

say scalar_op([1,2,[3,[4]]], '+', 42)  #=> [43, 44, [45,  [46]]]
say scalar_op([1,2,[3,[4]]], '*', 42)  #=> [42, 84, [126, [168]]]

Iteration over 2D arrays

The extended for-in loop provides support for iterating over a 2D-array, which is useful in combination with the cross and zip metaoperators:

for a,b in ([1,2] ~X [3,4]) {
    say "#{a} #{b}"
}

This is equivalent with:

[[1,2], [3,4]].cartesian {|a,b|
    say "#{a} #{b}"
}

and outputs:

1 3
1 4
2 3
2 4