forceFunction: allow functors as well
This commit is contained in:
parent
055ab1fc8d
commit
8a87521636
3 changed files with 13 additions and 1 deletions
|
@ -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;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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);
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue