commit e90569905ecdfe3225314f0e5f122263aa68efb2 Author: Eelco Dolstra Date: Mon Sep 2 15:18:15 2013 +0200 Initial version of nix-repl This program interactively reads a Nix expression from the user, evaluates it, and prints the result. diff --git a/default.nix b/default.nix new file mode 100644 index 000000000..55c9ed9e3 --- /dev/null +++ b/default.nix @@ -0,0 +1,10 @@ +with import { }; + +runCommand "nix-repl" + { buildInputs = [ readline nixUnstable boehmgc ]; } + '' + mkdir -p $out/bin + g++ -O3 -Wall -o $out/bin/nix-repl ${./nix-repl.cc} \ + -I${nixUnstable}/include/nix -L${nixUnstable}/lib/nix \ + -lexpr -lmain -lreadline + '' diff --git a/nix-repl.cc b/nix-repl.cc new file mode 100644 index 000000000..ea248b5ca --- /dev/null +++ b/nix-repl.cc @@ -0,0 +1,57 @@ +#include +#include + +#include +#include + +#include "shared.hh" +#include "eval.hh" + +using namespace std; +using namespace nix; + + +string programId = "nix-repl"; + + +void printHelp() +{ + std::cout << "Usage: nix-repl\n"; +} + + +bool getLine(string & line) +{ + char * s = readline ("nix-repl> "); + if (!s) return false; + line = chomp(string(s)); + free(s); + if (line != "") add_history(line.c_str()); + return true; +} + + +void run(nix::Strings args) +{ + EvalState state; + Path curDir = absPath("."); + + while (true) { + string line; + if (!getLine(line)) break; + + try { + Expr * e = state.parseExprFromString(line, curDir); + Value v; + state.eval(e, v); + state.strictForceValue(v); + std::cout << v << std::endl; + } catch (Error & e) { + printMsg(lvlError, e.msg()); + } + + std::cout << std::endl; + } + + std::cout << std::endl; +}