Skip to content

Commit

Permalink
* Mode --parse-only' to parse the input (on stdin, -'), and print
Browse files Browse the repository at this point in the history
  out the AST as an ATerm.
* Mode `--eval-only' to parse and evaluate the input, and print the
  resulting normal form as an ATerm.

Neither of these modes require store/DB write permission.
  • Loading branch information
edolstra committed Oct 26, 2004
1 parent 37d7abd commit ee401af
Showing 1 changed file with 28 additions and 8 deletions.
36 changes: 28 additions & 8 deletions src/nix-instantiate/main.cc
Expand Up @@ -15,17 +15,17 @@ void printHelp()
}


static Expr evalStdin(EvalState & state)
static Expr evalStdin(EvalState & state, bool parseOnly)
{
startNest(nest, lvlTalkative, format("evaluating standard input"));
string s, s2;
while (getline(cin, s2)) s += s2 + "\n";
Expr e = parseExprFromString(state, s, absPath("."));
return evalExpr(state, e);
return parseOnly ? e : evalExpr(state, e);
}


static void printNixExpr(EvalState & state, Expr e)
static void printDrvPaths(EvalState & state, Expr e)
{
ATMatcher m;
ATermList es;
Expand All @@ -45,26 +45,37 @@ static void printNixExpr(EvalState & state, Expr e)
ATermMap drvMap;
queryAllAttrs(e, drvMap);
for (ATermIterator i(drvMap.keys()); i; ++i)
printNixExpr(state, evalExpr(state, drvMap.get(*i)));
printDrvPaths(state, evalExpr(state, drvMap.get(*i)));
return;
}
}

if (atMatch(m, e) >> "List" >> es) {
for (ATermIterator i(es); i; ++i)
printNixExpr(state, evalExpr(state, *i));
printDrvPaths(state, evalExpr(state, *i));
return;
}

throw Error("expression does not evaluate to one or more derivations");
}


static void printResult(EvalState & state, Expr e, bool evalOnly)
{
if (evalOnly)
cout << format("%1%\n") % e;
else
printDrvPaths(state, e);
}


void run(Strings args)
{
EvalState state;
Strings files;
bool readStdin = false;
bool evalOnly = false;
bool parseOnly = false;

for (Strings::iterator it = args.begin();
it != args.end(); )
Expand All @@ -73,6 +84,14 @@ void run(Strings args)

if (arg == "-")
readStdin = true;
else if (arg == "--eval-only") {
readOnlyMode = true;
evalOnly = true;
}
else if (arg == "--parse-only") {
readOnlyMode = true;
parseOnly = evalOnly = true;
}
else if (arg[0] == '-')
throw UsageError(format("unknown flag `%1%`") % arg);
else
Expand All @@ -82,15 +101,16 @@ void run(Strings args)
openDB();

if (readStdin) {
Expr e = evalStdin(state);
printNixExpr(state, e);
Expr e = evalStdin(state, parseOnly);
printResult(state, e, evalOnly);
}

for (Strings::iterator it = files.begin();
it != files.end(); it++)
{
Expr e = evalFile(state, absPath(*it));
printNixExpr(state, e);
/* !!! parseOnly ignored */
printResult(state, e, evalOnly);
}

printEvalStats(state);
Expand Down

1 comment on commit ee401af

@nixos-discourse
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This commit has been mentioned on NixOS Discourse. There might be relevant details there:

https://discourse.nixos.org/t/where-can-one-find-more-info-on-the-motivation-s-behind-nix-instantiate-read-write-mode/14641/1

Please sign in to comment.