diff --git a/examples/string.fk b/examples/string.fk new file mode 100644 index 0000000..5c2f550 --- /dev/null +++ b/examples/string.fk @@ -0,0 +1,3 @@ +(assert= 'hello world' (cat 'hello' ' world')) +(assert= 'yoyoyo' (dup 'yo' 3)) +(assert= 'e' (char-at 'hello' 1)) \ No newline at end of file diff --git a/libstd/fun.cpp b/libstd/fun.cpp index 2ba76b5..1565b00 100644 --- a/libstd/fun.cpp +++ b/libstd/fun.cpp @@ -18,24 +18,6 @@ return std::make_shared(TYPE_BOOL, res, loc) -#define FLOAT_OP(NEUTRAL, OP) \ - if (args.empty()) \ - { \ - return std::make_shared(TYPE_FLOAT, NEUTRAL, loc); \ - } \ - \ - float result = std::get(args[0]->value()); \ - \ - for (size_t i=1; i(args[i]->value()); \ - } \ - if (args.size() == 1) \ - { \ - return std::make_shared(TYPE_FLOAT, OP result, loc); \ - } \ - return std::make_shared(TYPE_FLOAT, result, loc) - namespace fkstd { STDRET assert_eq(Loc loc, Module&, STDARGS args) @@ -184,7 +166,7 @@ namespace fkstd return std::make_shared(TYPE_INT, result, loc); } - STDRET add_float(Loc loc, Module& mod, STDARGS args) + STDRET add_float(Loc loc, Module&, STDARGS args) { if (args.empty()) { @@ -201,7 +183,7 @@ namespace fkstd return std::make_shared(TYPE_FLOAT, result, loc); } - STDRET sub_float(Loc loc, Module& mod, STDARGS args) + STDRET sub_float(Loc loc, Module&, STDARGS args) { if (args.empty()) { @@ -223,7 +205,7 @@ namespace fkstd return std::make_shared(TYPE_FLOAT, result, loc); } - STDRET mul_float(Loc loc, Module& mod, STDARGS args) + STDRET mul_float(Loc loc, Module&, STDARGS args) { if (args.empty()) { @@ -240,7 +222,7 @@ namespace fkstd return std::make_shared(TYPE_FLOAT, result, loc); } - STDRET div_float(Loc loc, Module& mod, STDARGS args) + STDRET div_float(Loc loc, Module&, STDARGS args) { if (args.empty()) { @@ -262,7 +244,7 @@ namespace fkstd return std::make_shared(TYPE_FLOAT, result, loc); } - STDRET mod_float(Loc loc, Module& mod, STDARGS args) + STDRET mod_float(Loc loc, Module&, STDARGS args) { if (args.empty()) { @@ -279,7 +261,7 @@ namespace fkstd return std::make_shared(TYPE_FLOAT, result, loc); } - STDRET pow_float(Loc loc, Module& mod, STDARGS args) + STDRET pow_float(Loc loc, Module&, STDARGS args) { if (args.empty()) { @@ -356,4 +338,45 @@ namespace fkstd return val->at(std::get(args.back()->value())); } + + STDRET string_cat(Loc loc, Module&, STDARGS args) + { + if (args.empty()) + { + return std::make_shared(TYPE_STRING, "", loc); + } + + std::string value = std::get(args[0]->value()); + + for (size_t i=1; i(args[i]->value()); + } + + return std::make_shared(TYPE_STRING, value, loc); + } + + STDRET string_dup(Loc loc, Module&, STDARGS args) + { + std::string str = std::get(args[0]->value()); + int n = std::get(args[1]->value()); + std::string res; + + for (int i=0; i(TYPE_STRING, res, loc); + } + + STDRET char_at(Loc loc, Module&, STDARGS args) + { + std::string str = std::get(args[0]->value()); + int n = std::get(args[1]->value()); + + return std::make_shared(TYPE_STRING, + std::string(1, str[n]), + loc); + } } diff --git a/libstd/fun.hpp b/libstd/fun.hpp index 42fb259..fad8a65 100644 --- a/libstd/fun.hpp +++ b/libstd/fun.hpp @@ -30,6 +30,10 @@ namespace fkstd STDRET bool_not(Loc loc, Module& mod, STDARGS args); STDRET array_ref(Loc loc, Module& mod, STDARGS args); + + STDRET string_cat(Loc loc, Module& mod, STDARGS args); + STDRET string_dup(Loc loc, Module& mod, STDARGS args); + STDRET char_at(Loc loc, Module& mod, STDARGS args); } #endif diff --git a/libstd/lib.cpp b/libstd/lib.cpp index 24a7648..80bfbfd 100644 --- a/libstd/lib.cpp +++ b/libstd/lib.cpp @@ -29,6 +29,9 @@ extern "C" void lib(Module& mod) mod.register_function("not", fkstd::bool_not); mod.register_function("ref", fkstd::array_ref); + mod.register_function("cat", fkstd::string_cat); + mod.register_function("dup", fkstd::string_dup); + mod.register_function("char-at", fkstd::char_at); mod.register_macro("!", fkstd::set_addr); mod.register_macro("assert-static-fail", fkstd::assert_static_fail);