forceFunction: allow functors as well

This commit is contained in:
Mathnerd314 2015-09-06 17:03:23 -06:00 committed by Eelco Dolstra
parent 055ab1fc8d
commit 8a87521636
3 changed files with 13 additions and 1 deletions

View file

@ -78,5 +78,15 @@ inline void EvalState::forceList(Value & v, const Pos & pos)
throwTypeError("value is %1% while a list was expected, at %2%", v, pos); throwTypeError("value is %1% while a list was expected, at %2%", v, pos);
} }
inline bool EvalState::isFunctor(Value& fun)
{
if (fun.type == tAttrs) {
auto found = fun.attrs->find(sFunctor);
if (found != fun.attrs->end()) {
return true;
}
}
return false;
}
} }

View file

@ -1294,7 +1294,7 @@ bool EvalState::forceBool(Value & v)
void EvalState::forceFunction(Value & v, const Pos & pos) void EvalState::forceFunction(Value & v, const Pos & pos)
{ {
forceValue(v); forceValue(v);
if (v.type != tLambda && v.type != tPrimOp && v.type != tPrimOpApp) if (v.type != tLambda && v.type != tPrimOp && v.type != tPrimOpApp && !isFunctor(v))
throwTypeError("value is %1% while a function was expected, at %2%", v, pos); throwTypeError("value is %1% while a function was expected, at %2%", v, pos);
} }

View file

@ -213,6 +213,8 @@ public:
elements and attributes are compared recursively. */ elements and attributes are compared recursively. */
bool eqValues(Value & v1, Value & v2); bool eqValues(Value & v1, Value & v2);
bool isFunctor(Value & fun);
void callFunction(Value & fun, Value & arg, Value & v, const Pos & pos); void callFunction(Value & fun, Value & arg, Value & v, const Pos & pos);
void callPrimOp(Value & fun, Value & arg, Value & v, const Pos & pos); void callPrimOp(Value & fun, Value & arg, Value & v, const Pos & pos);