ADD: eq? and assert-eq? core functions.

main
bog 2023-09-11 14:05:10 +02:00
parent 20b5e60557
commit 0795eb5d9f
1 changed files with 53 additions and 7 deletions

View File

@ -3,23 +3,8 @@
GRINO_ERROR(assertion_error);
extern "C" void lib(grino::Loader& loader)
extern "C" void lib_assert(grino::Loader& loader)
{
loader.add_native("dump", [](auto args){
std::string sep;
std::stringstream ss;
for (auto arg: args)
{
ss << sep << arg->string();
sep = " ";
}
std::cout << ss.str() << std::endl;
return grino::Value::make_nil(args.back()->loc());
});
loader.add_native("assert", [](auto args){
for (auto value: args)
@ -35,4 +20,65 @@ extern "C" void lib(grino::Loader& loader)
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; i<args.size(); i++)
{
auto rhs = args[i];
if (!lhs->equals(*rhs))
{
grino::Logger logger;
std::stringstream ss;
ss << "'" << lhs->string() << "' is not equals to '"
<< rhs->string() << "'";
logger.log<assertion_error>(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;
for (auto arg: args)
{
ss << sep << arg->string();
sep = " ";
}
std::cout << ss.str() << std::endl;
return grino::Value::make_nil(args.back()->loc());
});
loader.add_native("eq?", [](auto args){
auto lhs = args.front();
for (size_t i=1; i<args.size(); i++)
{
auto rhs = args[i];
if (!lhs->equals(*rhs))
{
return grino::Value::make_bool(rhs->loc(), false);
}
}
return grino::Value::make_bool(args.front()->loc(), true);
});
}