options prettier

This commit is contained in:
2024-01-03 23:38:48 +01:00
parent 0528cfed7f
commit 5490495227
11 changed files with 42 additions and 54 deletions

View File

@@ -2,10 +2,10 @@
(lambda (x) (g (f x)))
)
(define (foldl op acc l)
(define (fold op acc l)
(if (nil? l)
acc
(op (car l) (foldl op acc (cdr l)))
(op (car l) (fold op acc (cdr l)))
)
)
@@ -14,7 +14,7 @@
)
((decorate (lambda (x) (+ x 1)) (lambda (x) (+ x 2))) 1)
((decorate (lambda (lst) (foldl plus 0 lst)) (lambda (x) (* x x))) (quote(1 2 3)))
((decorate (lambda (lst) (foldl plus 0 lst)) (lambda (x) (/ x 2))) (quote(1 2 3)))
((decorate (lambda (lst) (foldl plus 0 lst)) (lambda (x) (= x 0))) (nil))
((decorate (lambda (lst) (foldl plus 0 lst)) (lambda (x) (= x 0))) (quote(1)))
((decorate (lambda (lst) (fold plus 0 lst)) (lambda (x) (* x x))) (quote(1 2 3)))
((decorate (lambda (lst) (fold plus 0 lst)) (lambda (x) (/ x 2))) (quote(1 2 3)))
((decorate (lambda (lst) (fold plus 0 lst)) (lambda (x) (= x 0))) (nil))
((decorate (lambda (lst) (fold plus 0 lst)) (lambda (x) (= x 0))) (quote(1)))

View File

@@ -44,10 +44,10 @@ void parse_options(int argc, char *argv[]) {
if (str.back() != '+' && str.back() != '-') {
throw std::invalid_argument("Bool options must be in format --option[+/-], instead have" + arg);
}
Options::set_bool(str.substr(0, str.length() - 1), str.back() == '+' ? true : false);
Options::set<bool>(str.substr(0, str.length() - 1), str.back() == '+' ? true : false);
} else if (split.size() == 2) {
try {
Options::set_int(split.at(0), std::stoi(split.at(1)));
Options::set<size_t>(split.at(0), std::stoi(split.at(1)));
} catch (...) { throw std::invalid_argument("Log options must be in format --log:TAG:LEVEL, instead have: " + arg); }
} else {
throw std::invalid_argument("Can't parse argument " + arg);
@@ -100,7 +100,7 @@ int main(int argc, char *argv[]) {
cur_expr = cur_expr.cdr();
}
}
if (Options::get_bool("repl"))
if (Options::get<bool>("repl"))
while (true) {
std::cout << std::endl << "> ";
vm.loadControl(repl);

View File

@@ -13,10 +13,24 @@
#include <variant>
class Options {
public:
static bool get_bool(const std::string &opt);
static size_t get_int(const std::string &opt);
static void set_bool(const std::string &opt, bool val);
static void set_int(const std::string &opt, size_t val);
template<typename T>
static T get(const std::string &opt) {
Options &o = get();
std::shared_lock l(o._mutex);
if (_defaults.find(opt) == _defaults.end()) throw std::invalid_argument("Unknown option " + opt);
if (!std::holds_alternative<T>(_defaults.at(opt))) throw std::invalid_argument("Bad option type " + opt);
return std::get<T>(o._current.at(opt));
}
template<typename T>
static void set(const std::string &opt, const T &val) {
Options &o = get();
std::lock_guard l(o._mutex);
if (_defaults.find(opt) == _defaults.end()) throw std::invalid_argument("Unknown option " + opt);
if (!std::holds_alternative<T>(_defaults.at(opt))) throw std::invalid_argument("Bad option type " + opt);
o._current[opt] = val;
}
static void reset();
static Options &get();

View File

@@ -55,7 +55,7 @@ void Logger::reset() {
}
int Logger::get_level(const std::string &tag) {
std::shared_lock l(get()._mutex);
int en_level = Options::get_int("default_log_level");
int en_level = Options::get<size_t>("default_log_level");
if (get()._levels.find(tag) != get()._levels.end()) en_level = get()._levels.at(tag);
return en_level;
}

View File

@@ -10,34 +10,7 @@ Options &Options::get() {
static Options opts;
return opts;
}
bool Options::get_bool(const std::string &opt) {
Options &o = get();
std::shared_lock l(o._mutex);
if (_defaults.find(opt) == _defaults.end()) throw std::invalid_argument("Unknown option " + opt);
if (!std::holds_alternative<bool>(_defaults.at(opt))) throw std::invalid_argument("Bad option type " + opt);
return std::get<bool>(o._current.at(opt));
}
size_t Options::get_int(const std::string &opt) {
Options &o = get();
std::shared_lock l(o._mutex);
if (_defaults.find(opt) == _defaults.end()) throw std::invalid_argument("Unknown option " + opt);
if (!std::holds_alternative<size_t>(_defaults.at(opt))) throw std::invalid_argument("Bad option type " + opt);
return std::get<size_t>(o._current.at(opt));
}
void Options::set_bool(const std::string &opt, bool val) {
Options &o = get();
std::lock_guard l(o._mutex);
if (_defaults.find(opt) == _defaults.end()) throw std::invalid_argument("Unknown option " + opt);
if (!std::holds_alternative<bool>(_defaults.at(opt))) throw std::invalid_argument("Bad option type " + opt);
o._current[opt] = val;
}
void Options::set_int(const std::string &opt, size_t val) {
Options &o = get();
std::lock_guard l(o._mutex);
if (_defaults.find(opt) == _defaults.end()) throw std::invalid_argument("Unknown option " + opt);
if (!std::holds_alternative<size_t>(_defaults.at(opt))) throw std::invalid_argument("Bad option type " + opt);
o._current[opt] = val;
}
void Options::reset() {
std::lock_guard l(get()._mutex);
get()._current = _defaults;

View File

@@ -29,6 +29,7 @@ namespace Command {
ADD = 13,
SUB = 14,
// Encountered in tests
READCHAR = 15,
PUTCHAR = 16,
PUTNUM = 17,
@@ -61,7 +62,7 @@ namespace Command {
{25, "EQ"}, {26, "LT"}, {27, "GT"}, {28, "NILC"}, {29, "MULT"}, {30, "DIV"}};
static inline Handle make_cmd(CellValType cmd) {
if (Options::get_bool("command_strs")) {
if (Options::get<bool>("command_strs")) {
return Handle(cmd_to_str.at(cmd));
} else
return Handle(cmd);

View File

@@ -73,17 +73,17 @@ private:
tcellnum = _temp_cells.size();
}
if ((_cells_num + tcellnum) >= (Options::get_int("cell_limit"))) {
if ((_cells_num + tcellnum) >= (Options::get<size_t>("cell_limit"))) {
// We might need to run GC twice as it has to process the messages;
Logger::log("MemoryContext", "Running forced gc", Logger::ERROR);
for (int i = 0; i < 3 && (_cells_num + tcellnum) >= (Options::get_int("cell_limit")); i++) {
for (int i = 0; i < 3 && (_cells_num + tcellnum) >= (Options::get<size_t>("cell_limit")); i++) {
request_gc_and_wait();
{
std::lock_guard tmplg(_new_roots_lock);
tcellnum = _temp_cells.size();
}
}
if ((_cells_num + tcellnum) >= (Options::get_int("cell_limit"))) {
if ((_cells_num + tcellnum) >= (Options::get<size_t>("cell_limit"))) {
Logger::log("MemoryContext", "Out of cells", Logger::ERROR);
throw std::runtime_error("Out of cells");
@@ -96,7 +96,7 @@ private:
std::lock_guard tmplg(_new_roots_lock);
Handle ret(cell);
_temp_cells.emplace_back(cell);
if ((_cells_num + _temp_cells.size() + 1) >= (size_t) (Options::get_int("cell_limit") / 2)) { request_gc(); }
if ((_cells_num + _temp_cells.size() + 1) >= (size_t) (Options::get<size_t>("cell_limit") / 2)) { request_gc(); }
return ret;
}
}

View File

@@ -13,7 +13,7 @@ public:
~Environment() override {}
void SetUp() override {
Options::set_bool("command_strs", true);
Options::set<bool>("command_strs", true);
Logger::set_level("VM", Logger::DEBUG);
Logger::set_level("Compiler", Logger::DEBUG);
}
@@ -273,8 +273,8 @@ TEST(CompilerTest, GlobalDefineFnMultiTwo) {
TEST(CompilerTest, GlobalDefineFnRec) {
std::stringstream ssin;
std::stringstream ssout;
Options::set_bool("command_strs", false);
Logger::set_level("VM", Options::get_int("default_log_level"));
Options::set<bool>("command_strs", false);
Logger::set_level("VM", Options::get<size_t>("default_log_level"));
{
VM vm(ssin, ssout);
Parser parser;
@@ -283,7 +283,7 @@ TEST(CompilerTest, GlobalDefineFnRec) {
vm.loadControl(parser.parseExpr());
vm.run();
}
Options::set_bool("command_strs", true);
Options::set<bool>("command_strs", true);
Logger::set_level("VM", Logger::DEBUG);
ssout.flush();
EXPECT_EQ(ssout.str(), "6765\n");

View File

@@ -10,7 +10,7 @@ public:
~Environment() override {}
void SetUp() override {
Options::set_int("cell_limit", 60000);
Options::set<size_t>("cell_limit", 60000);
Logger::set_level("Compiler", Logger::DEBUG);
}

View File

@@ -7,7 +7,7 @@ public:
~Environment() override {}
void SetUp() override {
Options::set_int("cell_limit", 1000);
Options::set<size_t>("cell_limit", 1000);
Logger::set_level("Compiler", Logger::DEBUG);
}

View File

@@ -8,7 +8,7 @@ public:
~Environment() override {}
void SetUp() override {
Options::set_int("cell_limit", 2000);
Options::set<size_t>("cell_limit", 2000);
Logger::set_level("Compiler", Logger::DEBUG);
}