Add function to reload rc file.
This commit is contained in:
		
							parent
							
								
									7e329be922
								
							
						
					
					
						commit
						9565d99fec
					
				@ -15,6 +15,7 @@ class abacus {
 | 
				
			|||||||
    private:
 | 
					    private:
 | 
				
			||||||
        libab ab;
 | 
					        libab ab;
 | 
				
			||||||
        ref scope;
 | 
					        ref scope;
 | 
				
			||||||
 | 
					        ref rc_scope;
 | 
				
			||||||
        std::map<std::string, ref> compiled_types;
 | 
					        std::map<std::string, ref> compiled_types;
 | 
				
			||||||
        libab_basetype basetype_string = { [](void* s) { delete ((string*) s); }, NULL, 0 };
 | 
					        libab_basetype basetype_string = { [](void* s) { delete ((string*) s); }, NULL, 0 };
 | 
				
			||||||
    public:
 | 
					    public:
 | 
				
			||||||
@ -26,6 +27,7 @@ class abacus {
 | 
				
			|||||||
        void add_operator_prefix(const std::string& op, const std::string& func);
 | 
					        void add_operator_prefix(const std::string& op, const std::string& func);
 | 
				
			||||||
        void add_operator_postfix(const std::string& op, const std::string& func);
 | 
					        void add_operator_postfix(const std::string& op, const std::string& func);
 | 
				
			||||||
        void add_standard();
 | 
					        void add_standard();
 | 
				
			||||||
 | 
					        void add_rc(const std::string& file);
 | 
				
			||||||
        ref run(const std::string& code);
 | 
					        ref run(const std::string& code);
 | 
				
			||||||
        template <typename ... Ts>
 | 
					        template <typename ... Ts>
 | 
				
			||||||
        ref call(const std::string& bane, Ts...params);
 | 
					        ref call(const std::string& bane, Ts...params);
 | 
				
			||||||
 | 
				
			|||||||
@ -1,5 +1,7 @@
 | 
				
			|||||||
#include "abacus.hpp"
 | 
					#include "abacus.hpp"
 | 
				
			||||||
#include "functions.hpp"
 | 
					#include "functions.hpp"
 | 
				
			||||||
 | 
					#include <fstream>
 | 
				
			||||||
 | 
					#include <sstream>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
abacus::abacus() {
 | 
					abacus::abacus() {
 | 
				
			||||||
    auto parse_function = [](const char* s) {
 | 
					    auto parse_function = [](const char* s) {
 | 
				
			||||||
@ -10,7 +12,8 @@ abacus::abacus() {
 | 
				
			|||||||
    };
 | 
					    };
 | 
				
			||||||
    libab_init(&ab, parse_function, free_function);
 | 
					    libab_init(&ab, parse_function, free_function);
 | 
				
			||||||
    libab_register_basetype(&ab, "str", &basetype_string);
 | 
					    libab_register_basetype(&ab, "str", &basetype_string);
 | 
				
			||||||
    libab_create_table(&ab, scope, &ab.table);
 | 
					    libab_create_table(&ab, rc_scope, &ab.table);
 | 
				
			||||||
 | 
					    libab_create_table(&ab, scope, rc_scope);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const libab_basetype* abacus::get_basetype_string() {
 | 
					const libab_basetype* abacus::get_basetype_string() {
 | 
				
			||||||
@ -81,6 +84,17 @@ void abacus::add_standard() {
 | 
				
			|||||||
    add_operator_postfix("!", "factorial");
 | 
					    add_operator_postfix("!", "factorial");
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void abacus::add_rc(const std::string& file) {
 | 
				
			||||||
 | 
					    std::ifstream rcfile(file);
 | 
				
			||||||
 | 
					    std::ostringstream str;
 | 
				
			||||||
 | 
					    ref value;
 | 
				
			||||||
 | 
					    if(rcfile.good()) {
 | 
				
			||||||
 | 
					        str << rcfile.rdbuf();
 | 
				
			||||||
 | 
					        libab_table_clear((libab_table*) libab_ref_get(rc_scope));
 | 
				
			||||||
 | 
					        libab_run_scoped(&ab, str.str().c_str(), rc_scope, value);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
ref abacus::run(const std::string& code) {
 | 
					ref abacus::run(const std::string& code) {
 | 
				
			||||||
    ref value;
 | 
					    ref value;
 | 
				
			||||||
    libab_run_scoped(&ab, code.c_str(), scope, value);
 | 
					    libab_run_scoped(&ab, code.c_str(), scope, value);
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										44
									
								
								src/main.cpp
									
									
									
									
									
								
							
							
						
						
									
										44
									
								
								src/main.cpp
									
									
									
									
									
								
							@ -3,8 +3,6 @@
 | 
				
			|||||||
#include <mpfr.h>
 | 
					#include <mpfr.h>
 | 
				
			||||||
#include <readline/readline.h>
 | 
					#include <readline/readline.h>
 | 
				
			||||||
#include <readline/history.h>
 | 
					#include <readline/history.h>
 | 
				
			||||||
#include <fstream>
 | 
					 | 
				
			||||||
#include <sstream>
 | 
					 | 
				
			||||||
#include "types.hpp"
 | 
					#include "types.hpp"
 | 
				
			||||||
#include "ref.hpp"
 | 
					#include "ref.hpp"
 | 
				
			||||||
#include "repl_functions.hpp"
 | 
					#include "repl_functions.hpp"
 | 
				
			||||||
@ -20,6 +18,7 @@ extern "C" {
 | 
				
			|||||||
// == Global State (uh-oh)
 | 
					// == Global State (uh-oh)
 | 
				
			||||||
bool close_requested = false;
 | 
					bool close_requested = false;
 | 
				
			||||||
long requested_precision = 3;
 | 
					long requested_precision = 3;
 | 
				
			||||||
 | 
					abacus abcs;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
FUNCTION(quit) {
 | 
					FUNCTION(quit) {
 | 
				
			||||||
    close_requested = true;
 | 
					    close_requested = true;
 | 
				
			||||||
@ -27,6 +26,12 @@ FUNCTION(quit) {
 | 
				
			|||||||
    return LIBAB_SUCCESS;
 | 
					    return LIBAB_SUCCESS;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					FUNCTION(reload_rc) {
 | 
				
			||||||
 | 
					    abcs.add_rc("./.abcsrc");
 | 
				
			||||||
 | 
					    libab_get_unit_value(ab, into);
 | 
				
			||||||
 | 
					    return LIBAB_SUCCESS;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
FUNCTION(request_precision) {
 | 
					FUNCTION(request_precision) {
 | 
				
			||||||
    number* value = (number*) libab_unwrap_param(params, 0);
 | 
					    number* value = (number*) libab_unwrap_param(params, 0);
 | 
				
			||||||
    requested_precision = std::min(PRECISION / 4, std::max(2, value->to_int()));
 | 
					    requested_precision = std::min(PRECISION / 4, std::max(2, value->to_int()));
 | 
				
			||||||
@ -34,47 +39,38 @@ FUNCTION(request_precision) {
 | 
				
			|||||||
    return LIBAB_SUCCESS;
 | 
					    return LIBAB_SUCCESS;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void run_rc(abacus& ab) {
 | 
					 | 
				
			||||||
    std::ifstream rcfile("./.abcsrc");
 | 
					 | 
				
			||||||
    std::ostringstream str;
 | 
					 | 
				
			||||||
    if(rcfile.good()) {
 | 
					 | 
				
			||||||
        str << rcfile.rdbuf();
 | 
					 | 
				
			||||||
        ab.run(str.str());
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
int main() {
 | 
					int main() {
 | 
				
			||||||
    abacus ab;
 | 
					 | 
				
			||||||
    rl_bind_key('\t', rl_insert);
 | 
					    rl_bind_key('\t', rl_insert);
 | 
				
			||||||
    size_t index = 0;
 | 
					    size_t index = 0;
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
    ab.add_standard();
 | 
					    abcs.add_standard();
 | 
				
			||||||
    ab.add_function("quit", function_quit, "()->unit");
 | 
					    abcs.add_function("quit", function_quit, "()->unit");
 | 
				
			||||||
    ab.add_function("request_precision", function_request_precision, "(num)->unit");
 | 
					    abcs.add_function("request_precision", function_request_precision, "(num)->unit");
 | 
				
			||||||
 | 
					    abcs.add_function("reload_rc", function_reload_rc, "()->unit");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    ab.add_function("print", function_print_string, "(str)->unit");
 | 
					    abcs.add_function("print", function_print_string, "(str)->unit");
 | 
				
			||||||
    ab.add_function("to_string", function_to_string_num, "(num)->str");
 | 
					    abcs.add_function("to_string", function_to_string_num, "(num)->str");
 | 
				
			||||||
    ab.add_function("to_string", function_to_string_bool, "(bool)->str");
 | 
					    abcs.add_function("to_string", function_to_string_bool, "(bool)->str");
 | 
				
			||||||
    ab.add_function("to_string", function_to_string_unit, "(unit)->str");
 | 
					    abcs.add_function("to_string", function_to_string_unit, "(unit)->str");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    run_rc(ab);
 | 
					    abcs.add_rc("./.abcsrc");
 | 
				
			||||||
    while(!close_requested) {
 | 
					    while(!close_requested) {
 | 
				
			||||||
        char* data = readline(" > ");
 | 
					        char* data = readline(" > ");
 | 
				
			||||||
        std::string buffer(data);
 | 
					        std::string buffer(data);
 | 
				
			||||||
        add_history(data);
 | 
					        add_history(data);
 | 
				
			||||||
        free(data);
 | 
					        free(data);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        ref value = ab.run(buffer);
 | 
					        ref value = abcs.run(buffer);
 | 
				
			||||||
        if(value == nullptr) {
 | 
					        if(value == nullptr) {
 | 
				
			||||||
            std::cout << "Invalid expression." << std::endl;
 | 
					            std::cout << "Invalid expression." << std::endl;
 | 
				
			||||||
        } else {
 | 
					        } else {
 | 
				
			||||||
            std::string name = "r" + std::to_string(index);
 | 
					            std::string name = "r" + std::to_string(index);
 | 
				
			||||||
            std::string ans = "ans";
 | 
					            std::string ans = "ans";
 | 
				
			||||||
            ab.add_variable(name, value);
 | 
					            abcs.add_variable(name, value);
 | 
				
			||||||
            ab.add_variable(ans, value);
 | 
					            abcs.add_variable(ans, value);
 | 
				
			||||||
            index++;
 | 
					            index++;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            std::cout << name << " = " << ab.to_string(value) << std::endl;
 | 
					            std::cout << name << " = " << abcs.to_string(value) << std::endl;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
		Reference in New Issue
	
	Block a user