Пример #1
0
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;
  }
}