forked from lix-project/lix
* Factor out evaluation into a separate file.
This commit is contained in:
parent
9f8f39aa3c
commit
403cb9327f
|
@ -1,6 +1,6 @@
|
||||||
bin_PROGRAMS = fix-ng
|
bin_PROGRAMS = fix-ng
|
||||||
|
|
||||||
fix_ng_SOURCES = fix-expr.cc parser.cc fix.cc
|
fix_ng_SOURCES = fix-expr.cc parser.cc eval.cc fix.cc
|
||||||
fix_ng_LDADD = ../libmain/libmain.a ../libnix/libnix.a ../boost/format/libformat.a \
|
fix_ng_LDADD = ../libmain/libmain.a ../libnix/libnix.a ../boost/format/libformat.a \
|
||||||
-L../../externals/inst/lib -ldb_cxx -lsglr -lATB -lconversion -lasfix2 -lmept -lATerm
|
-L../../externals/inst/lib -ldb_cxx -lsglr -lATB -lconversion -lasfix2 -lmept -lATerm
|
||||||
|
|
||||||
|
|
45
src/fix-ng/eval.cc
Normal file
45
src/fix-ng/eval.cc
Normal file
|
@ -0,0 +1,45 @@
|
||||||
|
#include "eval.hh"
|
||||||
|
#include "expr.hh"
|
||||||
|
#include "parser.hh"
|
||||||
|
|
||||||
|
|
||||||
|
EvalState::EvalState()
|
||||||
|
{
|
||||||
|
blackHole = ATmake("BlackHole()");
|
||||||
|
if (!blackHole) throw Error("cannot build black hole");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Expr evalExpr2(EvalState & state, Expr e)
|
||||||
|
{
|
||||||
|
return e;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Expr evalExpr(EvalState & state, Expr e)
|
||||||
|
{
|
||||||
|
Nest nest(lvlVomit, format("evaluating expression: %1%") % printTerm(e));
|
||||||
|
|
||||||
|
/* Consult the memo table to quickly get the normal form of
|
||||||
|
previously evaluated expressions. */
|
||||||
|
NormalForms::iterator i = state.normalForms.find(e);
|
||||||
|
if (i != state.normalForms.end()) {
|
||||||
|
if (i->second == state.blackHole)
|
||||||
|
throw badTerm("infinite recursion", e);
|
||||||
|
return i->second;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Otherwise, evaluate and memoize. */
|
||||||
|
state.normalForms[e] = state.blackHole;
|
||||||
|
Expr nf = evalExpr2(state, e);
|
||||||
|
state.normalForms[e] = nf;
|
||||||
|
return nf;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Expr evalFile(EvalState & state, const Path & path)
|
||||||
|
{
|
||||||
|
Nest nest(lvlTalkative, format("evaluating file `%1%'") % path);
|
||||||
|
Expr e = parseExprFromFile(path);
|
||||||
|
return evalExpr(state, e);
|
||||||
|
}
|
31
src/fix-ng/eval.hh
Normal file
31
src/fix-ng/eval.hh
Normal file
|
@ -0,0 +1,31 @@
|
||||||
|
#ifndef __EVAL_H
|
||||||
|
#define __EVAL_H
|
||||||
|
|
||||||
|
#include <map>
|
||||||
|
|
||||||
|
#include "fix-expr.hh"
|
||||||
|
|
||||||
|
|
||||||
|
typedef map<Expr, Expr> NormalForms;
|
||||||
|
//typedef map<Path, PathSet> PkgPaths;
|
||||||
|
//typedef map<Path, Hash> PkgHashes;
|
||||||
|
|
||||||
|
struct EvalState
|
||||||
|
{
|
||||||
|
NormalForms normalForms;
|
||||||
|
// PkgPaths pkgPaths;
|
||||||
|
// PkgHashes pkgHashes; /* normalised package hashes */
|
||||||
|
Expr blackHole;
|
||||||
|
|
||||||
|
EvalState();
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
/* Evaluate an expression to normal form. */
|
||||||
|
Expr evalExpr(EvalState & state, Expr e);
|
||||||
|
|
||||||
|
/* Evaluate an expression read from the given file to normal form. */
|
||||||
|
Expr evalFile(EvalState & state, const Path & path);
|
||||||
|
|
||||||
|
|
||||||
|
#endif /* !__EVAL_H */
|
|
@ -1,36 +1,14 @@
|
||||||
#include <map>
|
#include <map>
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
|
|
||||||
#include "parser.hh"
|
|
||||||
#include "globals.hh"
|
#include "globals.hh"
|
||||||
#include "normalise.hh"
|
#include "normalise.hh"
|
||||||
#include "shared.hh"
|
#include "shared.hh"
|
||||||
|
#include "expr.hh"
|
||||||
|
#include "eval.hh"
|
||||||
|
|
||||||
|
|
||||||
typedef map<ATerm, ATerm> NormalForms;
|
#if 0
|
||||||
typedef map<Path, PathSet> PkgPaths;
|
|
||||||
typedef map<Path, Hash> PkgHashes;
|
|
||||||
|
|
||||||
struct EvalState
|
|
||||||
{
|
|
||||||
Paths searchDirs;
|
|
||||||
NormalForms normalForms;
|
|
||||||
PkgPaths pkgPaths;
|
|
||||||
PkgHashes pkgHashes; /* normalised package hashes */
|
|
||||||
Expr blackHole;
|
|
||||||
|
|
||||||
EvalState()
|
|
||||||
{
|
|
||||||
blackHole = ATmake("BlackHole()");
|
|
||||||
if (!blackHole) throw Error("cannot build black hole");
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
static Expr evalFile(EvalState & state, const Path & path);
|
|
||||||
static Expr evalExpr(EvalState & state, Expr e);
|
|
||||||
|
|
||||||
|
|
||||||
#if 0
|
#if 0
|
||||||
static Path searchPath(const Paths & searchDirs, const Path & relPath)
|
static Path searchPath(const Paths & searchDirs, const Path & relPath)
|
||||||
{
|
{
|
||||||
|
@ -380,35 +358,7 @@ static Expr evalExpr2(EvalState & state, Expr e)
|
||||||
/* Barf. */
|
/* Barf. */
|
||||||
throw badTerm("invalid expression", e);
|
throw badTerm("invalid expression", e);
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
static Expr evalExpr(EvalState & state, Expr e)
|
|
||||||
{
|
|
||||||
Nest nest(lvlVomit, format("evaluating expression: %1%") % printTerm(e));
|
|
||||||
|
|
||||||
/* Consult the memo table to quickly get the normal form of
|
|
||||||
previously evaluated expressions. */
|
|
||||||
NormalForms::iterator i = state.normalForms.find(e);
|
|
||||||
if (i != state.normalForms.end()) {
|
|
||||||
if (i->second == state.blackHole)
|
|
||||||
throw badTerm("infinite recursion", e);
|
|
||||||
return i->second;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Otherwise, evaluate and memoize. */
|
|
||||||
state.normalForms[e] = state.blackHole;
|
|
||||||
Expr nf = evalExpr2(state, e);
|
|
||||||
state.normalForms[e] = nf;
|
|
||||||
return nf;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
static Expr evalFile(EvalState & state, const Path & path)
|
|
||||||
{
|
|
||||||
Nest nest(lvlTalkative, format("evaluating file `%1%'") % path);
|
|
||||||
Expr e = parseExprFromFile(path);
|
|
||||||
return evalExpr(state, e);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
static Expr evalStdin(EvalState & state)
|
static Expr evalStdin(EvalState & state)
|
||||||
|
@ -444,20 +394,25 @@ void run(Strings args)
|
||||||
Strings files;
|
Strings files;
|
||||||
bool readStdin = false;
|
bool readStdin = false;
|
||||||
|
|
||||||
|
#if 0
|
||||||
state.searchDirs.push_back(".");
|
state.searchDirs.push_back(".");
|
||||||
state.searchDirs.push_back(nixDataDir + "/fix");
|
state.searchDirs.push_back(nixDataDir + "/fix");
|
||||||
|
#endif
|
||||||
|
|
||||||
for (Strings::iterator it = args.begin();
|
for (Strings::iterator it = args.begin();
|
||||||
it != args.end(); )
|
it != args.end(); )
|
||||||
{
|
{
|
||||||
string arg = *it++;
|
string arg = *it++;
|
||||||
|
|
||||||
|
#if 0
|
||||||
if (arg == "--includedir" || arg == "-I") {
|
if (arg == "--includedir" || arg == "-I") {
|
||||||
if (it == args.end())
|
if (it == args.end())
|
||||||
throw UsageError(format("argument required in `%1%'") % arg);
|
throw UsageError(format("argument required in `%1%'") % arg);
|
||||||
state.searchDirs.push_back(*it++);
|
state.searchDirs.push_back(*it++);
|
||||||
}
|
}
|
||||||
else if (arg == "--verbose" || arg == "-v")
|
else
|
||||||
|
#endif
|
||||||
|
if (arg == "--verbose" || arg == "-v")
|
||||||
verbosity = (Verbosity) ((int) verbosity + 1);
|
verbosity = (Verbosity) ((int) verbosity + 1);
|
||||||
else if (arg == "-")
|
else if (arg == "-")
|
||||||
readStdin = true;
|
readStdin = true;
|
||||||
|
|
Loading…
Reference in a new issue