[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  }
     
在这种情况下, caseC1,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