/* Defining a For function */
Function("For",{forstart,forpredicate,forincrement,forbody})
[
  Eval(forstart);
  While (Equals(Eval(forpredicate),True))
  [
    Eval(forbody);
    Eval(forincrement);
  ];
];
UnFence("For",4);
HoldArg("For",forstart);
HoldArg("For",forpredicate);
HoldArg("For",forincrement);
HoldArg("For",forbody);

Function("Verify",{aLeft,aRight})
[
  If (Not(Equals(Eval(aLeft),aRight)),
    [
      WriteString("***** ");
      Write(aLeft);
      WriteString(" does not evaluate to ");
      Write(aRight);
      NewLine();
      False;
    ],
    True
  );
];
/*
HoldArg("Verify",aLeft);
HoldArg("Verify",aRight);
*/


Function("ForEach",{foreachitem,foreachlist,foreachbody})
[
   Local(foreachi,foreachlen);
   foreachlen:=Length(foreachlist);
   foreachi:=0;
   While (foreachi < foreachlen)
   [
     foreachi++;
     MacroLocal(foreachitem);
     MacroSet(foreachitem,foreachlist[[foreachi]]);
     Eval(foreachbody);
   ];
];
UnFence("ForEach",3);
HoldArg("ForEach",foreachitem);
HoldArg("ForEach",foreachbody);

RuleBase("Apply",{applyoper,applylist});
Rule("Apply",2,0,IsString(applyoper))
    Eval(UnList(Concat({Atom(applyoper)},applylist)));

Rule("Apply",2,0,IsList(applyoper))
[
  Eval(UnList(Concat({Local},applyoper[[1]])));
  Map("MacroSet",{applyoper[[1]],applylist});
  Eval(applyoper[[2]]);
];
UnFence("Apply",2);
HoldArg("Apply",applyoper);

