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