diff --git a/lib/cast.hpp b/lib/cast.hpp new file mode 100644 index 0000000..d0d8d4f --- /dev/null +++ b/lib/cast.hpp @@ -0,0 +1,26 @@ +#include "commons.hpp" + +extern "C" void lib_cast(grino::Loader& loader) +{ + grino::Loc loc {"core/casts"}; + + loader.add_native("stoi", [loc](auto args){ + std::string value = args[0]->as_string(); + return grino::Value::make_int(loc, std::stoi(value)); + }); + + loader.add_native("itos", [loc](auto args){ + int value = args[0]->as_int(); + return grino::Value::make_string(loc, std::to_string(value)); + }); + + loader.add_native("stof", [loc](auto args){ + std::string value = args[0]->as_string(); + return grino::Value::make_int(loc, std::stof(value)); + }); + + loader.add_native("ftos", [loc](auto args){ + float value = args[0]->as_float(); + return grino::Value::make_string(loc, std::to_string(value)); + }); +} diff --git a/lib/commons.hpp b/lib/commons.hpp new file mode 100644 index 0000000..5d91bc0 --- /dev/null +++ b/lib/commons.hpp @@ -0,0 +1,5 @@ +#include "../src/Loader.hpp" +#include "src/Logger.hpp" +#include "src/Value.hpp" +#include "src/opcodes.hpp" +#include "../src/Module.hpp" diff --git a/lib/core.cpp b/lib/core.cpp index 4527ab4..6076f2f 100644 --- a/lib/core.cpp +++ b/lib/core.cpp @@ -3,6 +3,7 @@ #include "src/Value.hpp" #include "src/opcodes.hpp" #include "../src/Module.hpp" +#include "cast.hpp" GRINO_ERROR(assertion_error); @@ -671,6 +672,7 @@ extern "C" void lib(grino::Loader& loader) lib_collection(loader); lib_array(loader); lib_string(loader); + lib_cast(loader); loader.add_native("dump", [](auto args){ std::string sep; diff --git a/lib/std/io.hpp b/lib/std/io.hpp index 1bd258c..b5a6076 100644 --- a/lib/std/io.hpp +++ b/lib/std/io.hpp @@ -21,4 +21,11 @@ extern "C" void lib_io(grino::Loader& loader) std::cout << std::endl; return grino::Value::make_nil(grino::Loc {"io"}); }); + + mod->loader()->add_native("read", [](auto args){ + std::string value; + std::cin >> value; + + return grino::Value::make_string(grino::Loc {"io"}, value); + }); } diff --git a/lib/std/rand.hpp b/lib/std/rand.hpp new file mode 100644 index 0000000..7cfb7ac --- /dev/null +++ b/lib/std/rand.hpp @@ -0,0 +1,33 @@ +#include +#include + +#include "src/Loader.hpp" +#include "src/Module.hpp" + +extern "C" void lib_rand(grino::Loader& loader) +{ + grino::Loc loc {"core/rand"}; + auto mod = loader.add_module("rand"); + + mod->loader()->add_native("randf", [loc](auto args){ + std::mt19937 r; + + r.seed(std::chrono::steady_clock::now().time_since_epoch().count()); + + std::uniform_real_distribution urd(0.0f, 1.0f); + + return grino::Value::make_float(loc, urd(r)); + }); + + mod->loader()->add_native("range", [loc](auto args){ + std::mt19937 r; + + r.seed(std::chrono::steady_clock::now().time_since_epoch().count()); + int from = args[0]->as_int(); + int to = args[1]->as_int(); + + std::uniform_int_distribution dist(from, to); + + return grino::Value::make_int(loc, dist(r)); + }); +} diff --git a/lib/std/std.cpp b/lib/std/std.cpp index 079738f..3c171b3 100644 --- a/lib/std/std.cpp +++ b/lib/std/std.cpp @@ -1,8 +1,10 @@ #include "src/Loader.hpp" #include "io.hpp" +#include "rand.hpp" extern "C" void lib(grino::Loader& loader) { lib_io(loader); + lib_rand(loader); } diff --git a/src/VM.cpp b/src/VM.cpp index e56f69c..7060075 100644 --- a/src/VM.cpp +++ b/src/VM.cpp @@ -212,7 +212,6 @@ namespace grino { if (fun) { - std::cout << "store INIT" << std::endl; fun->set_env(itr->first, Value::make_copy(itr->second->loc(), itr->second));