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))) (lambda (x) (g (f x)))
) )
(define (foldl op acc l) (define (fold op acc l)
(if (nil? l) (if (nil? l)
acc 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 (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) (fold 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) (fold 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) (fold 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 0))) (quote(1)))

View File

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

View File

@@ -13,10 +13,24 @@
#include <variant> #include <variant>
class Options { class Options {
public: public:
static bool get_bool(const std::string &opt); template<typename T>
static size_t get_int(const std::string &opt); static T get(const std::string &opt) {
static void set_bool(const std::string &opt, bool val); Options &o = get();
static void set_int(const std::string &opt, size_t val); 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 void reset();
static Options &get(); static Options &get();

View File

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

View File

@@ -10,34 +10,7 @@ Options &Options::get() {
static Options opts; static Options opts;
return 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() { void Options::reset() {
std::lock_guard l(get()._mutex); std::lock_guard l(get()._mutex);
get()._current = _defaults; get()._current = _defaults;

View File

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

View File

@@ -73,17 +73,17 @@ private:
tcellnum = _temp_cells.size(); 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; // We might need to run GC twice as it has to process the messages;
Logger::log("MemoryContext", "Running forced gc", Logger::ERROR); 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(); request_gc_and_wait();
{ {
std::lock_guard tmplg(_new_roots_lock); std::lock_guard tmplg(_new_roots_lock);
tcellnum = _temp_cells.size(); 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); Logger::log("MemoryContext", "Out of cells", Logger::ERROR);
throw std::runtime_error("Out of cells"); throw std::runtime_error("Out of cells");
@@ -96,7 +96,7 @@ private:
std::lock_guard tmplg(_new_roots_lock); std::lock_guard tmplg(_new_roots_lock);
Handle ret(cell); Handle ret(cell);
_temp_cells.emplace_back(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; return ret;
} }
} }

View File

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

View File

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

View File

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

View File

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