/*
_x + 0 <-- x;

PROLOG();
if (type(expr) == "+")
{
  MATCHVAR("x",arg(expr,1));
  if (string(arg(expr,2)) = "0")
  {
    //body
  }
}
EPILOG();
*/

RuleBase("PatGen",{a,b});
HoldArg("PatGen",a);
HoldArg("PatGen",b);
LocalSymbols(f,body)
10 # PatGen(f_IsAtom,_body) <--
[
  Echo({"VAR: ",f});
  MatchAtom(f);
];
LocalSymbols(f,body)
20 # PatGen(_f,_body)_(Type(f)="_")    <--  MatchVariable(Tail(Listify(f)));

LocalSymbols(args,i,matchArgs,f,body)
30 # PatGen(f_IsFunction,_body) <--
[
  Local(args,i,matchArgs);
  Set(args,Tail(Listify(f)));
  matchArgs:={};
//Echo({f});
//Echo({args});
  For(i:=1,i<=Length(args),i++)
  [
//Echo({args[i]});
//Echo({Apply("PatGen",{args[i],t})});
    DestructiveAppend(matchArgs,Eval(Subst(u,args[i])Hold(PatGen(u,True))));
  ];
  MatchFunc(Type(f),matchArgs,body);
];

LocalSymbols(name,args,body,item)
10 # PatAddAsm(MatchFunc(_name,_args,_body)) <--
[
  Echo({
"
if (type(expr) == ",String(name),")
{
"});
ForEach(item,args)
[
  PatAddAsm(item);
];
Echo({body});
  Echo({
"
}
"});
];

/*
LocalSymbols(name)
10 # PatAddAsm(MatchAtom(_name)) <--
[
  Echo({
"if (
"});
];
*/

100 # PatAddAsm(_f) <-- [Echo({f});];

/*
10 # PatAddAsm(EnterMatchFunc(_type)) <--
[
  Echo({
"
if (type(expr) == ":String(type):")
{
"});
];
10 # PatAddAsm(LeaveMatchFunc()) <--
[
  Echo({
"
}
"});
];

*/
