mirror of
https://github.com/usatiuk/psil.git
synced 2025-10-28 10:47:49 +01:00
options prettier
This commit is contained in:
@@ -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)))
|
||||
@@ -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);
|
||||
|
||||
@@ -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();
|
||||
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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");
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user