diff --git a/lib/core.cpp b/lib/core.cpp index 930b47e..632ba61 100644 --- a/lib/core.cpp +++ b/lib/core.cpp @@ -3,8 +3,54 @@ GRINO_ERROR(assertion_error); +extern "C" void lib_assert(grino::Loader& loader) +{ + loader.add_native("assert", [](auto args){ + + for (auto value: args) + { + if (!value->as_bool()) + { + grino::Logger logger; + logger.log(grino::LOG_ASSERT, + value->loc(), + "assertion failed"); + } + } + + return grino::Value::make_bool(args.front()->loc(), true); + }); + + loader.add_native("assert-eq?", [](auto args){ + auto lhs = args.front(); + + for (size_t i=1; iequals(*rhs)) + { + grino::Logger logger; + std::stringstream ss; + + ss << "'" << lhs->string() << "' is not equals to '" + << rhs->string() << "'"; + + logger.log(grino::LOG_ASSERT, + lhs->loc(), + ss.str()); + + } + } + + return grino::Value::make_bool(args.front()->loc(), true); + }); +} + extern "C" void lib(grino::Loader& loader) { + lib_assert(loader); + loader.add_native("dump", [](auto args){ std::string sep; std::stringstream ss; @@ -20,16 +66,16 @@ extern "C" void lib(grino::Loader& loader) return grino::Value::make_nil(args.back()->loc()); }); - loader.add_native("assert", [](auto args){ + loader.add_native("eq?", [](auto args){ + auto lhs = args.front(); - for (auto value: args) + for (size_t i=1; ias_bool()) + auto rhs = args[i]; + + if (!lhs->equals(*rhs)) { - grino::Logger logger; - logger.log(grino::LOG_ASSERT, - value->loc(), - "assertion failed"); + return grino::Value::make_bool(rhs->loc(), false); } }