bool ArgDef::CheckArg(ExpressionEvaluator evaluator, ExpressionPtr &arg, const TypeInfo &expectedType, size_t argNum, string &error) const { if (arg && TypeHelper::TypeMatches(expectedType, arg->Type()) || evaluator(arg)) { if (&expectedType == &Literal::TypeInstance && &arg->Type() == &Quote::TypeInstance) { return true; } if (!TypeHelper::TypeMatches(expectedType, arg->Type())) { error = "Argument " + to_string(argNum) + ": Expected " + expectedType.Name() + ", got " + arg->Type().Name(); return false; } else return true; } else { error = "Argument " + to_string(argNum) + ": Failed to evaluate"; return false; } }