/* ============================================================ */
/*DOC:
-===$doarray===
- $doarray:''VAR1'',''VAR2'',...[:''INDEX_VAR'']
+===$iteratearray===
+ $iteratearray:''VAR1'',''VAR2'',...[:''INDEX_VAR'']
...
- $enddoarray
+ [$noperform]
+ ...
+ $enditerate
-配列''VAR1'', ''VAR2'', ...の各要素をそれぞれ変数''VAR1'', ''VAR2'', ...に代入しながら,$enddoarrayまでのブロックを繰り返し実行する。
+配列''VAR1'', ''VAR2'', ...の各要素をそれぞれ変数''VAR1'', ''VAR2'', ...に代入しながら,$enditerateまでのブロックを繰り返し実行する。
ブロックの中で変数''VAR1'', ...に代入した値は,配列に書き戻される。
配列の長さが異なる場合は,配列''VAR1''の長さに揃えられる。
''INDEX_VAR''を指定すると,配列のインデックス番号を変数''INDEX_VAR''に代入して,ブロックを実行する。
*/
-//#WIKICMD $doarray $enddoarray wc_doarray
+//#WIKICMD $doarray $noperform $enddoarray wc_doarray
+//#WIKICMD $iteratearray $noperform $enditerate wc_doarray
void wc_doarray (WikiLine* wl, WikiFormat* wiki) {
WikiMotor motor (wl->begin, wl->end, wiki);
WikiMotorObjVec objv;
iv = clipWhite (args[1]->textOut (wiki));
}
} else {
- wiki->errorMsg.append (CharConst ("$doarray: wrong number of parameters.\n"));
+ wiki->errorMsg.append (CharConst ("$iteratearray: wrong number of parameters.\n"));
}
iu = lv.size ();
if (iu > 0) {
n = wiki->mlenv->getArySize (lv[0]);
- for (i = 1; i <= n; i ++) {
- for (it = 0; it < iu; it ++) {
- wiki->mlenv->setVar (lv[it], wiki->mlenv->getAry (lv[it], i));
- }
- if (iv.size () > 0) {
- h = newMNode_num (i);
- wiki->mlenv->setVar (iv, h ());
+ if (n > 0) {
+ for (i = 1; i <= n; i ++) {
+ for (it = 0; it < iu; it ++) {
+ wiki->mlenv->setVar (lv[it], wiki->mlenv->getAry (lv[it], i));
+ }
+ if (iv.size () > 0) {
+ h = newMNode_num (i);
+ wiki->mlenv->setVar (iv, h ());
+ }
+ do_linevec (wl->block, wiki);
+ for (it = 0; it < iu; it ++) {
+ wiki->mlenv->setAry (lv[it], i, wiki->mlenv->getVar (lv[it]));
+ }
}
- do_linevec (wl->block, wiki);
for (it = 0; it < iu; it ++) {
- wiki->mlenv->setAry (lv[it], i, wiki->mlenv->getVar (lv[it]));
+ wiki->mlenv->setArySize (lv[it], n);
}
+ } else {
+ if (wl->block2 && wl->block2->block)
+ do_linevec (wl->block2->block, wiki);
}
- for (it = 0; it < iu; it ++) {
- wiki->mlenv->setArySize (lv[it], n);
- }
+ } else {
+ if (wl->block2 && wl->block2->block)
+ do_linevec (wl->block2->block, wiki);
}
}
/* ============================================================ */
/*DOC:
-===$dovector===
- $dovector:''VAR1'',''VAR2'',...[:''INDEX_VAR'']
+===$iteratevector===
+ $iteratevector:''VAR1'',''VAR2'',...[:''INDEX_VAR'']
+ ...
+ [$noperform]
...
- $enddovector
+ $enditerate
-ベクタ''VAR1'', ''VAR2'', ...の各要素をそれぞれ変数''VAR1'', ''VAR2'', ...に代入しながら,$enddovectorまでのブロックを繰り返し実行する。
+ベクタ''VAR1'', ''VAR2'', ...の各要素をそれぞれ変数''VAR1'', ''VAR2'', ...に代入しながら,$enditerateまでのブロックを繰り返し実行する。
ブロックの中で変数''VAR1'', ...に代入した値は,配列に書き戻されない。
ベクタの長さが異なる場合は,ベクタ''VAR1''の長さに揃えられる。
''INDEX_VAR''を指定すると,配列のインデックス番号を変数''INDEX_VAR''に代入して,ブロックを実行する。
*/
-//#WIKICMD $dovector $enddovector wc_dovector
+//#WIKICMD $dovector $noperform $enddovector wc_dovector
+//#WIKICMD $iteratevector $noperform $enditerate wc_dovector
void wc_dovector (WikiLine* wl, WikiFormat* wiki) {
WikiMotor motor (wl->begin, wl->end, wiki);
WikiMotorObjVec objv;
lvv.back () = t;
} else if (isNil (t)) {
} else {
- wiki->errorMsg.append (CharConst ("$dovector: bad value type.\n"));
+ wiki->errorMsg.append (CharConst ("$iteratevector: bad value type.\n"));
}
}
if (args.size () == 2) {
iv = clipWhite (args[1]->textOut (wiki));
}
} else {
- wiki->errorMsg.append (CharConst ("$dovector: wrong number of parameters.\n"));
+ wiki->errorMsg.append (CharConst ("$iteratevector: wrong number of parameters.\n"));
}
iu = lv.size ();
if (iu > 0) {
n = lvv[0] ()->vectorSize ();
- for (i = 0; i < n; ++ i) {
- for (it = 0; it < iu; ++ it) {
- wiki->mlenv->setVar (lv[it], lvv[it] ()->vectorGet (i));
+ if (n > 0) {
+ for (i = 0; i < n; ++ i) {
+ for (it = 0; it < iu; ++ it) {
+ wiki->mlenv->setVar (lv[it], lvv[it] ()->vectorGet (i));
+ }
+ if (iv.size () > 0) {
+ h = newMNode_num (i);
+ wiki->mlenv->setVar (iv, h ());
+ }
+ do_linevec (wl->block, wiki);
}
- if (iv.size () > 0) {
- h = newMNode_num (i);
- wiki->mlenv->setVar (iv, h ());
+ for (it = 0; it < iu; ++ it) { // 書き戻す
+ wiki->mlenv->setVar (lv[it], lvv[it] ());
}
- do_linevec (wl->block, wiki);
- }
- for (it = 0; it < iu; ++ it) { // 書き戻す
- wiki->mlenv->setVar (lv[it], lvv[it] ());
+ } else {
+ if (wl->block2 && wl->block2->block)
+ do_linevec (wl->block2->block, wiki);
}
+ } else {
+ if (wl->block2 && wl->block2->block)
+ do_linevec (wl->block2->block, wiki);
}
}
/* ============================================================ */
/*DOC:
-===$dotable===
- $dotable:''VARKEY'',''VARVAL'':''TABLEVAR''
+===$iteratetable===
+ $iteratetable:''VARKEY'',''VARVAL'':''TABLEVAR''
...
- $enddotable
+ [$noperform]
+ ...
+ $enditerate
-テーブル''TABLEVAR''の各要素のキーと値ををそれぞれ変数''VAR1'', ''VAR2''に代入しながら,$enddotableまでのブロックを繰り返し実行する。
+テーブル''TABLEVAR''の各要素のキーと値ををそれぞれ変数''VAR1'', ''VAR2''に代入しながら,$enditerateまでのブロックを繰り返し実行する。
*/
-//#WIKICMD $dotable $enddotable wc_dotable
+//#WIKICMD $dotable $doperform $enddotable wc_dotable
+//#WIKICMD $iteratetable $doperform $enditerate wc_dotable
void wc_dotable (WikiLine* wl, WikiFormat* wiki) {
WikiMotor motor (wl->begin, wl->end, wiki);
WikiMotorObjVec objv;
motor.compile (objv);
objv.splitCharA (':', args);
if (args.size () != 2) {
- wiki->errorMsg.append (CharConst ("$dovector: wrong number of parameters.\n"));
+ wiki->errorMsg.append (CharConst ("$iteratetable: wrong number of parameters.\n"));
return;
}
WikiMotorObjVecVec v;
s = clipWhite (args[1]->textOut (wiki));
tbl = wiki->getVar (s);
if (! isTable (tbl ())) {
- wiki->errorMsg.append (CharConst ("$dovector: bad value type.\n"));
+ wiki->errorMsg.append (CharConst ("$iteratetable: bad value type.\n"));
return;
}
MotorVar::iterator b = tbl ()->table->begin ();
MotorVar::iterator t = tbl ()->table->end ();
- for (; b != t; ++ b) {
- wiki->mlenv->setVar (vkey, newMNode_str (new ustring ((*b).first))); // テーブルのキーは、文字列
- wiki->mlenv->setVar (vval, (*b).second ());
- do_linevec (wl->block, wiki);
+ if (b != t) {
+ for (; b != t; ++ b) {
+ wiki->mlenv->setVar (vkey, newMNode_str (new ustring ((*b).first))); // テーブルのキーは、文字列
+ wiki->mlenv->setVar (vval, (*b).second ());
+ do_linevec (wl->block, wiki);
+ }
+ } else {
+ if (wl->block2 && wl->block2->block)
+ do_linevec (wl->block2->block, wiki);
}
}