#include "fun.hpp" namespace fkstd { STDRET assert_eq(Loc loc, STDARGS args) { auto oracle = args[0]; auto expr = args[1]; if (!oracle->equals(*expr)) { std::stringstream ss; ss << "assertion failed: expected '" << oracle->string() << "', got '" << expr->string() << "'"; loc.error(LOG_ERROR, ss.str()); } return std::make_shared(TYPE_BOOL, true, loc); } STDRET println(Loc loc, STDARGS args) { std::string sep; for (auto arg: args) { std::cout << sep << arg->string(); sep = " "; } if (args.size() > 0) { loc = args.front()->loc(); } std::cout << std::endl; return std::make_shared(TYPE_INT, 0, loc); } STDRET add_int(Loc loc, STDARGS args) { int result = 0; for (auto arg: args) { result += std::get(arg->value()); } return std::make_shared(TYPE_INT, result, loc); } STDRET sub_int(Loc loc, STDARGS args) { if (args.empty()) { return std::make_shared(TYPE_INT, 0, loc); } if (args.size() == 1) { return std::make_shared(TYPE_INT, -std::get(args[0]->value()), loc); } int result = std::get(args[0]->value()); for (size_t i=1; i(args[i]->value()); } return std::make_shared(TYPE_INT, result, loc); } STDRET mul_int(Loc loc, STDARGS args) { int result = 1; for (auto arg: args) { result *= std::get(arg->value()); } return std::make_shared(TYPE_INT, result, loc); } STDRET div_int(Loc loc, STDARGS args) { if (args.empty()) { return std::make_shared(TYPE_INT, 1, loc); } if (args.size() == 1) { return std::make_shared(TYPE_INT, 1/std::get(args[0]->value()), loc); } int result = std::get(args[0]->value()); for (size_t i=1; i(args[i]->value()); } return std::make_shared(TYPE_INT, result, loc); } STDRET mod_int(Loc loc, STDARGS args) { if (args.empty()) { return std::make_shared(TYPE_INT, 1, loc); } int result = std::get(args[0]->value()); for (size_t i=1; i(args[i]->value()); } return std::make_shared(TYPE_INT, result, loc); } STDRET pow_int(Loc loc, STDARGS args) { if (args.empty()) { return std::make_shared(TYPE_INT, 1, loc); } int result = std::get(args[0]->value()); for (size_t i=1; i(args[i]->value())); } return std::make_shared(TYPE_INT, result, loc); } }