#ifndef VARIABLES_HPP_ #define VARIABLES_HPP_ #include #include #include "node.hpp" /** Represent a global or local symbol table, which * stores variables and functions. In fact, there's no difference * between a variable and a function of no arguments. */ typedef std::map symbol_table; /** Set a temporary symbol table, for the duration of a single function. * When the set_symbol_table object goes out of scope, * the local symbol table is no longer in force. */ class set_symbol_table { public: set_symbol_table(symbol_table const& symtab); ~set_symbol_table(); }; /** Get the value of a variable. * @param name The variable name * @return The value of variable @p name or node() if the variable is undefined. */ node get_variable(std::string const& name); /** Get the definition of a function. * @param name The function name * @return The definition of function named @p name * @throw no_such_function if the function is not defined */ node get_function(std::string const& name); /** Set the value of a variable. * @param name The variable name * @param value The value. if the variable is already defined, changes its value. */ void set_variable(std::string const& name, node value); /** Set the definition of a function. * @param name The function name * @param definition The function definition */ void set_function(std::string const& name, node definition); /** Save all variable and function definitions to a file. * The file is a simple text file, so you can examine it in any text editor. * @param filename The name of the file. * @throw calc_error if the file cannot be created */ void save_library(std::string const& filename); /** Load variable and function definitions from a file. * Definitions in the file overwrite existing definitions with the same name. * @param filename The file name * @throw calc_error for I/O errors */ void load_library(std::string const& filename); #endif