
/* example using javascript for outputting a trace of an execution.
 * NiceTraceExp does the same as TraceExp, but exporting the result
 * as a html file with an expandable list (using javascript).
 * NiceTraceRule does the same, but for TraceRule.
 *
 * You can use this file standalone by typing Load("tracejscript"),
 * calling one of the NiceTrace.. functions and then starting up
 * netscape with trace.html.
 */

Use("jscriptheaders");

trde:=0;
trind:={1};
TrReset() <--
[
  trde:=0;
  trind:={1};
];



BuildName(_current,_list) <-- current:BuildName(list);

1 # BuildName({}) <-- "";
2 # BuildName(_list) <--
[
  BuildName(Tail(list)):"x":String(list[1]);
];

Increment(_list) <--
[
  list[1] := list[1]+1;
];

TrEnter(_expr) <--
[
  Local(h,prevh);
  h:=BuildName("traceitem",trind);
  prevh:=BuildName("traceitem",Tail(trind));
  WriteString("var ");
  WriteString(h);
  WriteString(" = new Folder('ENTER: ");
  Write(expr);
  WriteString("', 'closed', '");
  WriteString(h);
  WriteString("');");
  NewLine();
  WriteString(prevh);
  WriteString(".Add(");
  WriteString(h);
  WriteString(");");
  NewLine();
  trind:= 1:trind;
];
HoldArg("TrEnter",arg1);

TrLeave(_expr,_result) <--
[
  Local(h,prevh);
  h:=BuildName("traceitem",trind);

  trind:=Tail(trind);
  prevh:=BuildName("traceitem",Tail(trind));
  Increment(trind);

  WriteString("var ");
  WriteString(h);
  WriteString(" = new Item('http://etc', 'ONSITE', 'LEAVE: ");
  Write(expr);
  WriteString(" &lt- ");
  Write(result);
  WriteString("', '");
  WriteString(h);
  WriteString("');");
  NewLine();
  WriteString(prevh);
  WriteString(".Add(");
  WriteString(h);
  WriteString(");");
  NewLine();
];
HoldArg("TrLeave",arg1);
HoldArg("TrLeave",arg2);

TrArg(_expr,_result) <--
[
  Local(h,prevh);
  h:=BuildName("traceitem",trind);

  prevh:=BuildName("traceitem",Tail(trind));
  Increment(trind);

  WriteString("var ");
  WriteString(h);
  WriteString(" = new Item('http://etc', 'ONSITE', 'ARG: ");
  Write(expr);
  WriteString(" &lt- ");
  Write(result);
  WriteString("', '");
  WriteString(h);
  WriteString("');");
  NewLine();
  WriteString(prevh);
  WriteString(".Add(");
  WriteString(h);
  WriteString(");");
  NewLine();
];
HoldArg("TrArg",arg1);
HoldArg("TrArg",arg2);


ThunkToJScript() <--
[
  ToFile("trace.html")
  [
   JSHeader();
   Load("trace.tmp");
   JSFooter();
  ];
];


NiceTraceExp(_expr) <--
[
  Local(res);
  res:=ToFile("trace.tmp")Eval(UnList({TraceExp,expr}));
  ThunkToJScript();
  res;
];
HoldArg("NiceTraceExp",arg1);

NiceTraceRule(_pat,_expr) <--
[
  Local(res);
  res:=ToFile("trace.tmp")Eval(UnList({TraceRule,pat,expr}));
  ThunkToJScript();
  res;
];
HoldArg("NiceTraceRule",arg1);
HoldArg("NiceTraceRule",arg2);

