/** * Eval "process" from a list of definitions. * * Strict evaluation of a block diagram expression by applying beta reduction. * @param eqlist a list of faust defintions forming the the global environment * @return the process block diagram in normal form */ Tree evalprocess (Tree eqlist) { Tree b = a2sb(eval(boxIdent("process"), gGlobal->nil, pushMultiClosureDefs(eqlist, gGlobal->nil, gGlobal->nil))); if (gGlobal->gSimplifyDiagrams) { b = boxSimplification(b); } return b; }
static void writeIdentValue(std::string& dst, const std::string& format, const std::string& ident, Tree visited, Tree localValEnv) { int f = atoi(format.c_str()); int n = eval2int(boxIdent(ident.c_str()), visited, localValEnv); int i = min(4,max(f,0)); char val[256]; snprintf(val, 250, Formats[i], n); dst += val; }
static Tree realeval (Tree exp, Tree visited, Tree localValEnv) { //Tree def; Tree fun; Tree arg; Tree var, num, body, ldef; Tree label; Tree cur, lo, hi, step; Tree e1, e2, exp2, notused, visited2, lenv2; Tree rules; Tree id; //cerr << "EVAL " << *exp << " (visited : " << *visited << ")" << endl; //cerr << "REALEVAL of " << *exp << endl; xtended* xt = (xtended*) getUserData(exp); // constants //----------- if ( xt || isBoxInt(exp) || isBoxReal(exp) || isBoxWire(exp) || isBoxCut(exp) || isBoxPrim0(exp) || isBoxPrim1(exp) || isBoxPrim2(exp) || isBoxPrim3(exp) || isBoxPrim4(exp) || isBoxPrim5(exp) || isBoxFFun(exp) || isBoxFConst(exp) || isBoxFVar(exp) || isBoxWaveform(exp)) { return exp; // block-diagram constructors //--------------------------- } else if (isBoxSeq(exp, e1, e2)) { return boxSeq(eval(e1, visited, localValEnv), eval(e2, visited, localValEnv)); } else if (isBoxPar(exp, e1, e2)) { return boxPar(eval(e1, visited, localValEnv), eval(e2, visited, localValEnv)); } else if (isBoxRec(exp, e1, e2)) { return boxRec(eval(e1, visited, localValEnv), eval(e2, visited, localValEnv)); } else if (isBoxSplit(exp, e1, e2)) { return boxSplit(eval(e1, visited, localValEnv), eval(e2, visited, localValEnv)); } else if (isBoxMerge(exp, e1, e2)) { return boxMerge(eval(e1, visited, localValEnv), eval(e2, visited, localValEnv)); // Modules //-------- } else if (isBoxAccess(exp, body, var)) { Tree val = eval(body, visited, localValEnv); if (isClosure(val, exp2, notused, visited2, lenv2)) { // it is a closure, we have an environment to access return eval(closure(var,notused,visited2,lenv2), visited, localValEnv); } else { evalerror(getDefFileProp(exp), getDefLineProp(exp), "no environment to access", exp); } //////////////////////en chantier//////////////////////////// } else if (isBoxModifLocalDef(exp, body, ldef)) { Tree val = eval(body, visited, localValEnv); if (isClosure(val, exp2, notused, visited2, lenv2)) { // we rebuild the closure using a copy of the original environment // modified with some new definitions Tree lenv3 = copyEnvReplaceDefs(lenv2, ldef, visited2, localValEnv); return eval(closure(exp2,notused,visited2,lenv3), visited, localValEnv); } else { evalerror(getDefFileProp(exp), getDefLineProp(exp), "not a closure", val); evalerror(getDefFileProp(exp), getDefLineProp(exp), "no environment to access", exp); } /////////////////////////////////////////////////////////////////// } else if (isBoxComponent(exp, label)) { string fname = tree2str(label); Tree eqlst = gGlobal->gReader.expandlist(gGlobal->gReader.getlist(fname)); Tree res = closure(boxIdent("process"), gGlobal->nil, gGlobal->nil, pushMultiClosureDefs(eqlst, gGlobal->nil, gGlobal->nil)); setDefNameProperty(res, label); //cerr << "component is " << boxpp(res) << endl; return res; } else if (isBoxLibrary(exp, label)) { string fname = tree2str(label); Tree eqlst = gGlobal->gReader.expandlist(gGlobal->gReader.getlist(fname)); Tree res = closure(boxEnvironment(), gGlobal->nil, gGlobal->nil, pushMultiClosureDefs(eqlst, gGlobal->nil, gGlobal->nil)); setDefNameProperty(res, label); //cerr << "component is " << boxpp(res) << endl; return res; // user interface elements //------------------------ } else if (isBoxButton(exp, label)) { const char* l1 = tree2str(label); const char* l2 = evalLabel(l1, visited, localValEnv); //cout << "button label : " << l1 << " become " << l2 << endl; return ((l1 == l2) ? exp : boxButton(tree(l2))); } else if (isBoxCheckbox(exp, label)) { const char* l1 = tree2str(label); const char* l2 = evalLabel(l1, visited, localValEnv); //cout << "check box label : " << l1 << " become " << l2 << endl; return ((l1 == l2) ? exp : boxCheckbox(tree(l2))); } else if (isBoxVSlider(exp, label, cur, lo, hi, step)) { const char* l1 = tree2str(label); const char* l2 = evalLabel(l1, visited, localValEnv); return ( boxVSlider(tree(l2), tree(eval2double(cur, visited, localValEnv)), tree(eval2double(lo, visited, localValEnv)), tree(eval2double(hi, visited, localValEnv)), tree(eval2double(step, visited, localValEnv)))); } else if (isBoxHSlider(exp, label, cur, lo, hi, step)) { const char* l1 = tree2str(label); const char* l2 = evalLabel(l1, visited, localValEnv); return ( boxHSlider(tree(l2), tree(eval2double(cur, visited, localValEnv)), tree(eval2double(lo, visited, localValEnv)), tree(eval2double(hi, visited, localValEnv)), tree(eval2double(step, visited, localValEnv)))); } else if (isBoxNumEntry(exp, label, cur, lo, hi, step)) { const char* l1 = tree2str(label); const char* l2 = evalLabel(l1, visited, localValEnv); return (boxNumEntry(tree(l2), tree(eval2double(cur, visited, localValEnv)), tree(eval2double(lo, visited, localValEnv)), tree(eval2double(hi, visited, localValEnv)), tree(eval2double(step, visited, localValEnv)))); } else if (isBoxVGroup(exp, label, arg)) { const char* l1 = tree2str(label); const char* l2 = evalLabel(l1, visited, localValEnv); return boxVGroup(tree(l2), eval(arg, visited, localValEnv) ); } else if (isBoxHGroup(exp, label, arg)) { const char* l1 = tree2str(label); const char* l2 = evalLabel(l1, visited, localValEnv); return boxHGroup(tree(l2), eval(arg, visited, localValEnv) ); } else if (isBoxTGroup(exp, label, arg)) { const char* l1 = tree2str(label); const char* l2 = evalLabel(l1, visited, localValEnv); return boxTGroup(tree(l2), eval(arg, visited, localValEnv) ); } else if (isBoxHBargraph(exp, label, lo, hi)) { const char* l1 = tree2str(label); const char* l2 = evalLabel(l1, visited, localValEnv); return boxHBargraph(tree(l2), tree(eval2double(lo, visited, localValEnv)), tree(eval2double(hi, visited, localValEnv))); } else if (isBoxVBargraph(exp, label, lo, hi)) { const char* l1 = tree2str(label); const char* l2 = evalLabel(l1, visited, localValEnv); return boxVBargraph(tree(l2), tree(eval2double(lo, visited, localValEnv)), tree(eval2double(hi, visited, localValEnv))); // lambda calculus //---------------- } else if (isBoxIdent(exp)) { return evalIdDef(exp, visited, localValEnv); } else if (isBoxWithLocalDef(exp, body, ldef)) { return eval(body, visited, pushMultiClosureDefs(ldef, visited, localValEnv)); } else if (isBoxAppl(exp, fun, arg)) { return applyList( eval(fun, visited, localValEnv), revEvalList(arg, visited, localValEnv) ); } else if (isBoxAbstr(exp)) { // it is an abstraction : return a closure return closure(exp, gGlobal->nil, visited, localValEnv); } else if (isBoxEnvironment(exp)) { // environment : return also a closure return closure(exp, gGlobal->nil, visited, localValEnv); } else if (isClosure(exp, exp2, notused, visited2, lenv2)) { if (isBoxAbstr(exp2)) { // a 'real' closure return closure(exp2, gGlobal->nil, setUnion(visited,visited2), lenv2); } else if (isBoxEnvironment(exp2)) { // a 'real' closure return closure(exp2, gGlobal->nil, setUnion(visited,visited2), lenv2); } else { // it was a suspended evaluation return eval(exp2, setUnion(visited,visited2), lenv2); } // Algorithmic constructions //-------------------------- } else if (isBoxIPar(exp, var, num, body)) { int n = eval2int(num, visited, localValEnv); return iteratePar(var, n, body, visited, localValEnv); } else if (isBoxISeq(exp, var, num, body)) { int n = eval2int(num, visited, localValEnv); return iterateSeq(var, n, body, visited, localValEnv); } else if (isBoxISum(exp, var, num, body)) { int n = eval2int(num, visited, localValEnv); return iterateSum(var, n, body, visited, localValEnv); } else if (isBoxIProd(exp, var, num, body)) { int n = eval2int(num, visited, localValEnv); return iterateProd(var, n, body, visited, localValEnv); // static } else if (isBoxInputs(exp, body)) { int ins, outs; Tree b = a2sb(eval(body, visited, localValEnv)); if (getBoxType (b, &ins, &outs)) { return boxInt(ins); } else { stringstream error; error << "ERROR : can't evaluate ' : " << *exp << endl; throw faustexception(error.str()); } } else if (isBoxOutputs(exp, body)) { int ins, outs; Tree b = a2sb(eval(body, visited, localValEnv)); if (getBoxType (b, &ins, &outs)) { return boxInt(outs); } else { stringstream error; error << "ERROR : can't evaluate ' : " << *exp << endl; throw faustexception(error.str()); } } else if (isBoxSlot(exp)) { return exp; } else if (isBoxSymbolic(exp)) { return exp; // Pattern matching extension //--------------------------- } else if (isBoxCase(exp, rules)) { return evalCase(rules, localValEnv); } else if (isBoxPatternVar(exp, id)) { return exp; //return evalIdDef(id, visited, localValEnv); } else if (isBoxPatternMatcher(exp)) { return exp; } else { stringstream error; error << "ERROR : EVAL doesn't intercept : " << *exp << endl; throw faustexception(error.str()); } return NULL; }
/** * @brief Declare an automatic documentation. * * This function simulates a default documentation : * if no <mdoc> tag was found in the input faust file, * and yet the '-mdoc' option was called, * then print a complete 'process' doc. */ void declareAutoDoc() { Tree autodoc = nil; Tree process = boxIdent("process"); /** Autodoc's "head", with title, author, date, and metadatas. */ /** The latex title macro is bound to the metadata "name" if it exists, (corresponding to "declare name") or else just to the file name. */ autodoc = cons(docTxt("\\title{"), autodoc); if (gMetaDataSet.count(tree("name"))) { autodoc = cons(docMtd(tree("name")), autodoc); } else { autodoc = cons(docTxt(gDocName.c_str()), autodoc); } autodoc = cons(docTxt("}\n"), autodoc); /** The latex author macro is bound to the metadata "author" if it exists, (corresponding to "declare author") or else no author item is printed. */ if (gMetaDataSet.count(tree("author"))) { autodoc = cons(docTxt("\\author{"), autodoc); autodoc = cons(docMtd(tree("author")), autodoc); autodoc = cons(docTxt("}\n"), autodoc); } /** The latex date macro is bound to the metadata "date" if it exists, (corresponding to "declare date") or else to the today latex macro. */ autodoc = cons(docTxt("\\date{"), autodoc); if (gMetaDataSet.count(tree("date"))) { autodoc = cons(docMtd(tree("date")), autodoc); } else { autodoc = cons(docTxt("\\today"), autodoc); } autodoc = cons(docTxt("}\n"), autodoc); /** The latex maketitle macro. */ autodoc = cons(docTxt("\\maketitle\n"), autodoc); /** Insert all declared metadatas in a latex tabular environment. */ if (! gMetaDataSet.empty()) { autodoc = cons(docTxt("\\begin{tabular}{ll}\n"), autodoc); autodoc = cons(docTxt("\t\\hline\n"), autodoc); for (map<Tree, set<Tree> >::iterator i = gMetaDataSet.begin(); i != gMetaDataSet.end(); i++) { string mtdkey = tree2str(i->first); string mtdTranslatedKey = gDocMetadatasStringMap[mtdkey]; if (mtdTranslatedKey.empty()) { mtdTranslatedKey = mtdkey; } autodoc = cons(docTxt("\t\\textbf{"), autodoc); autodoc = cons(docTxt(mtdTranslatedKey.c_str()), autodoc); autodoc = cons(docTxt("} & "), autodoc); autodoc = cons(docMtd(tree(mtdkey.c_str())), autodoc); autodoc = cons(docTxt(" \\\\\n"), autodoc); } autodoc = cons(docTxt("\t\\hline\n"), autodoc); autodoc = cons(docTxt("\\end{tabular}\n"), autodoc); autodoc = cons(docTxt("\\bigskip\n"), autodoc); } /** Autodoc's "body", with equation and diagram of process, and notice and listing. */ string autoPresentationTxt = "\n\\bigskip\n" + gDocAutodocStringMap["thisdoc"] + "\n\n"; autodoc = cons(docTxt(autoPresentationTxt.c_str()), autodoc); string autoEquationTxt = "\n" + gDocAutodocStringMap["autoeqntitle"] + "\n\n"; autoEquationTxt += gDocAutodocStringMap["autoeqntext"] + "\n"; autodoc = cons(docTxt(autoEquationTxt.c_str()), autodoc); autodoc = cons(docEqn(process), autodoc); string autoDiagramTxt = "\n" + gDocAutodocStringMap["autodgmtitle"] + "\n\n"; autoDiagramTxt += gDocAutodocStringMap["autodgmtext"] + "\n"; autodoc = cons(docTxt(autoDiagramTxt.c_str()), autodoc); autodoc = cons(docDgm(process), autodoc); string autoNoticeTxt = "\n" + gDocAutodocStringMap["autontctitle"] + "\n\n"; // autoNoticeTxt += gDocAutodocStringMap["autontctext"] + "\n"; autodoc = cons(docTxt(autoNoticeTxt.c_str()), autodoc); autodoc = cons(docNtc(), autodoc); string autoListingTxt; vector<string> pathnames = gReader.listSrcFiles(); if(pathnames.size() > 1) { autoListingTxt = "\n" + gDocAutodocStringMap["autolsttitle2"] + "\n\n"; autoListingTxt += gDocAutodocStringMap["autolsttext2"] + "\n"; } else { autoListingTxt = "\n" + gDocAutodocStringMap["autolsttitle1"] + "\n\n"; autoListingTxt += gDocAutodocStringMap["autolsttext1"] + "\n"; } autodoc = cons(docTxt(autoListingTxt.c_str()), autodoc); autodoc = cons(docLst(), autodoc); declareDoc(autodoc); }