ADD: cast int/float/string functions.

ADD: rand module with randf and range functions.
main
bog 2023-09-14 17:35:39 +02:00
parent 64d17de693
commit 29facf1647
7 changed files with 75 additions and 1 deletions

26
lib/cast.hpp Normal file
View File

@ -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));
});
}

5
lib/commons.hpp Normal file
View File

@ -0,0 +1,5 @@
#include "../src/Loader.hpp"
#include "src/Logger.hpp"
#include "src/Value.hpp"
#include "src/opcodes.hpp"
#include "../src/Module.hpp"

View File

@ -3,6 +3,7 @@
#include "src/Value.hpp" #include "src/Value.hpp"
#include "src/opcodes.hpp" #include "src/opcodes.hpp"
#include "../src/Module.hpp" #include "../src/Module.hpp"
#include "cast.hpp"
GRINO_ERROR(assertion_error); GRINO_ERROR(assertion_error);
@ -671,6 +672,7 @@ extern "C" void lib(grino::Loader& loader)
lib_collection(loader); lib_collection(loader);
lib_array(loader); lib_array(loader);
lib_string(loader); lib_string(loader);
lib_cast(loader);
loader.add_native("dump", [](auto args){ loader.add_native("dump", [](auto args){
std::string sep; std::string sep;

View File

@ -21,4 +21,11 @@ extern "C" void lib_io(grino::Loader& loader)
std::cout << std::endl; std::cout << std::endl;
return grino::Value::make_nil(grino::Loc {"io"}); 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);
});
} }

33
lib/std/rand.hpp Normal file
View File

@ -0,0 +1,33 @@
#include <random>
#include <chrono>
#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<float> 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<int> dist(from, to);
return grino::Value::make_int(loc, dist(r));
});
}

View File

@ -1,8 +1,10 @@
#include "src/Loader.hpp" #include "src/Loader.hpp"
#include "io.hpp" #include "io.hpp"
#include "rand.hpp"
extern "C" void lib(grino::Loader& loader) extern "C" void lib(grino::Loader& loader)
{ {
lib_io(loader); lib_io(loader);
lib_rand(loader);
} }

View File

@ -212,7 +212,6 @@ namespace grino
{ {
if (fun) if (fun)
{ {
std::cout << "store INIT" << std::endl;
fun->set_env(itr->first, fun->set_env(itr->first,
Value::make_copy(itr->second->loc(), Value::make_copy(itr->second->loc(),
itr->second)); itr->second));