    [NAME]
    ALL.dao.tutorial.controls

    [TITLE]
    Dao Constrol Structures

    [DESCRIPTION]

     0.1   If-Else

    当某条件表达式值为真时，执行一块代码：

       1  if( expr1 ){
       2     block1;
       3  }elif( expr2 ){
       4     block2;
       5  }else{
       6     block3;
       7  }

    如果条件表达式 expr1的值为真， block1将被执行； 否则如条件 expr2为真， block2被执行； 否
    则执行 block3。可使用零个或多个 elseif / elif, 和零个或一个 else。

       1  if( 2 > 1 ) io.writeln("2 is larger than 1.")

     0.2   For

    道语言支持多种形式的for循环，最方便使用的是下面这种，

       1  for( 变量 = 初值 : 步长 : 终值 ){
       2     代码;
       3  }

    循环将从 变量=初值开始执行，然后每次循环后， 变量的值按 步长 增加，直到 变量的值变得大于
    终值时终止循环。 这里 步长可以省略，其缺省值是1。 初值， 步长和 终值总是在循环开始前被计
    算。

    C/C++类型 for循环：

       1  for( init; condition; step ){
       2     block;
       3  }

    for语句块的执行顺序是这样的：

      1. 执行循环初始表达式 init；转到3；
      2. 执行 step；
      3. 执行条件表达式 condition；
      4. 检查 condition的值：如为真，转到5，否则转到6；
      5. 执行 block；转到2；
      6. 终止循环，开始执行循环体后面的语句。

    一般情况下，C/C++类型 for循环等价于下面的 while循环:

       1  init;
       2  while( condition ){
       3     block;
       4     step;
       5  }

    但如果 block包含一个不被其他循环语句包含的 skip语句，那么上面这个 while循环 与C/C++类型
    for循环并不完全等价。因在 for循环体中， skip只跳过 block 块余下的部分，而在上面的 while
    循环中， skip将同时跳过 step语句。

    道语言也支持Python风格的 for-in循环：

       1  for( item in list ){
       2      block;
       3  }

    关联表也可用在for-in循环中，这里 item将会是一对键与值，

       1  for( item in a_map ){
       2      block;
       3  }

    在一个for-in循环中可以使用多个in语句，但那些列表或关联表必须含有相同个数的元素， 否则，
    程序将抛出例外，

       1  for( item1 in list1; item2 in list2; ... ){
       2      block;
       3  }

    例子，

       1  for( i=0; i<3; i++ ){
       2      io.writeln( i );
       3  }
       4
       5  hash = { "b" => 11, "a" => 22, "e" => 33, "c" => 44 };
       6  for( a in hash.key(); b in hash.value(); c in {1 : 1 : hash.size()-1 } ){
       7      #if a == "a" break
       8      io.writeln( a, "\t", b, "\t", c );
       9  }

    这个例子抛出了一个例外，因为最后那个列表的元素数目比其他第一个列表少一。

     0.3   While

    当某条件表达式值为真时， 反复执行一块代码：

       1  while( expr ){
       2     block;
       3  }

    如果条件表达式 expr值为真，反复执行 block直到表达式 expr值为假。

       1  i = 0;
       2  while( i < 5 ){
       3     io.writeln( i );
       4     i ++;
       5  }

     0.4   Do-While

       1  do{
       2      block;
       3  } while ( condition )

    执行代码块 block, 然后在条件表达式式 condition为真 的情况下重复执行 block。

     0.5   Switch-Case

    Switch-case开关控制可基于一个表达式的值选择相应的代码块执行。它可以用来方便地实现的分支
    控制。

       1  switch( exprs ){
       2     case C1 : block1
       3     case C2 : block2
       4     case C3 : block3
       5     ...
       6     default: block0
       7  }

    如果表达式 exprs的值等于某个 case语句的 Ci，代码块 blocki将被执行。 这里 Ci必须是常量，
    可以是不同类型的值。与C/C++不同的是，代码块 blocki被执行后， 程序执行将跳到 switch块外，
    因此这里不需要象C/C++里那样使用 break语句来显示跳出 switch块。
    如果你需要对不同的 case值都执行同一块代码，你仅需将那些 case值放在一起：

       1  switch( value ){
       2     case C1, C2, C3 :
       3        block3
       4     ...
       5     default: block0
       6  }

    在这种情况下， case值 C1,C2,C3将对应于同一代码块 block3。

       1  a = "a";
       2  switch( a ){
       3      case 1, "a" : io.write("case 1 or a");
       4      default :  io.write("case default");
       5  }

    道语言的switch-case结构还允许使用值区间作为case， 这样当switch值属于这个区间时，此case块
    将被执行。 需要注意的是，如果switch值属于多个相互重叠的区间， 那么对应下界最小的区间的
    case块将被执行。

       1  switch( 5 ){
       2  case 1 ... 5 : io.writeln( 'case 1-5' );
       3  case 5 ... 10 : io.writeln( 'case 5-10' );
       4  case 10 ... 11 : a = 1;
       5  }

     0.6   Break and Skip