Show a nested loop which searches a two-dimensional array filled with random numbers uniformly distributed over 



[
1
,
…
,
20
]


{\displaystyle [1,\ldots ,20]}

.

The loops iterate rows and columns of the array printing the elements until the value 



20


{\displaystyle 20}

 is met.

Specifically, this task also shows how to break out of nested loops.



Related tasks

   Loop over multiple arrays simultaneously
   Loops/Break
   Loops/Continue
   Loops/Do-while
   Loops/Downward for
   Loops/For
   Loops/For with a specified step
   Loops/Foreach
   Loops/Increment loop index within loop body
   Loops/Infinite
   Loops/N plus one half
   Loops/Nested
   Loops/While
   Loops/with multiple ranges
   Loops/Wrong ranges


/**
 Loops/Nested in Neko
 Tectonics:
   nekoc loops-nested.neko
   neko loops-nested.neko
*/
 
var random = $loader.loadprim("std@random_new", 0)();
var random_int = $loader.loadprim("std@random_int", 2);
 
var values = $amake(10);
var row = 0;
var col = 0;
 
while row < 10 {
  values[row] = $amake(10);
  col = 0;
  while col < 10 {
    values[row][col] = random_int(random, 20) + 1;
    col += 1;
  }
  row += 1;
}
 
/* Look for a 20 */
/*
 To break out of nested loops, (without using labels and $goto),
   Neko needs the value of the inner loop(s).
 The break statement sets the return value of a loop expression.
 Without a break, the value of a loop expression is unspecified.
*/
var inner;
row = 0;
while row < 10 {
  col = 0;
  inner = while col < 10 {
    $print("values[", row, "][", col, "] = ", values[row][col], "\n");
    if values[row][col] == 20 break true;
    col += 1;
  }
  if $istrue(inner) break;
  row += 1;
}