diff options
author | Eelco Dolstra <edolstra@gmail.com> | 2020-08-24 13:11:56 +0200 |
---|---|---|
committer | Eelco Dolstra <edolstra@gmail.com> | 2020-08-24 13:16:02 +0200 |
commit | 33b1679d75f2a3a5dac053431a41897ebf96a3f3 (patch) | |
tree | 879d2bb748c7d2bc4c6daf8ffa49c604dd265e6d /src/libexpr/eval.cc | |
parent | 88d5c9ec584f000c9a66ad34631fe4eb5c194172 (diff) |
Allow primops to have Markdown documentation
Diffstat (limited to 'src/libexpr/eval.cc')
-rw-r--r-- | src/libexpr/eval.cc | 28 |
1 files changed, 28 insertions, 0 deletions
diff --git a/src/libexpr/eval.cc b/src/libexpr/eval.cc index 9a155c055..6ac8bbc9f 100644 --- a/src/libexpr/eval.cc +++ b/src/libexpr/eval.cc @@ -525,6 +525,34 @@ Value * EvalState::addPrimOp(const string & name, } +Value * EvalState::addPrimOp(PrimOp && primOp) +{ + /* Hack to make constants lazy: turn them into a application of + the primop to a dummy value. */ + if (primOp.arity == 0) { + primOp.arity = 1; + auto vPrimOp = allocValue(); + vPrimOp->type = tPrimOp; + vPrimOp->primOp = new PrimOp(std::move(primOp)); + Value v; + mkApp(v, *vPrimOp, *vPrimOp); + return addConstant(primOp.name, v); + } + + Symbol envName = primOp.name; + if (hasPrefix(primOp.name, "__")) + primOp.name = symbols.create(std::string(primOp.name, 2)); + + Value * v = allocValue(); + v->type = tPrimOp; + v->primOp = new PrimOp(std::move(primOp)); + staticBaseEnv.vars[envName] = baseEnvDispl; + baseEnv.values[baseEnvDispl++] = v; + baseEnv.values[0]->attrs->push_back(Attr(primOp.name, v)); + return v; +} + + Value & EvalState::getBuiltin(const string & name) { return *baseEnv.values[0]->attrs->find(symbols.create(name))->value; |