more conversions & array operations

This commit is contained in:
ame 2023-09-21 13:23:36 -05:00
parent 735dc2f8ac
commit 83354f6bc7
5 changed files with 88 additions and 3 deletions

View File

@ -224,6 +224,37 @@ namespace builtin {
s->names[l->args[0].ident] = o;
return 0;
}
std::any _push(lexi *l,state *s){
auto ob = std::get<std::vector<object>>(l->args[0].value);
ob.push_back(l->args[1]);
l->args[0].value = ob;
return l->args[0];
}
std::any _pop(lexi *l,state *s){
auto ob = std::get<std::vector<object>>(l->args[0].value);
ob.pop_back();
l->args[0].value = ob;
return l->args[0];
}
std::any _insert(lexi *l,state *s){
auto ob = std::get<std::vector<object>>(l->args[0].value);
ob.insert(ob.begin()+std::get<int>(l->args[1].value),l->args[2]);
l->args[0].value = ob;
return l->args[0];
}
std::any _rem(lexi *l,state *s){
auto ob = std::get<std::vector<object>>(l->args[0].value);
ob.erase(ob.begin()+std::get<int>(l->args[1].value));
l->args[0].value = ob;
return l->args[0];
}
std::any _len(lexi *l,state *s){
return (int)std::get<std::vector<object>>(l->args[0].value).size();
}
std::any _tail(lexi *l, state* s){
auto ob = std::get<std::vector<object>>(l->args[0].value);
return ob[ob.size()-1];
}
}
void ttest(lexi l){

View File

@ -76,6 +76,14 @@ namespace builtin {
std::any _pp(lexi*, state*);
std::any _mm(lexi*, state*);
//array operations
std::any _push(lexi*, state*);
std::any _pop(lexi*, state*);
std::any _insert(lexi*, state*);
std::any _rem(lexi*, state*);
std::any _len(lexi*, state*);
std::any _tail(lexi*, state*);
}
@ -113,12 +121,21 @@ static builtin::builtin _read("read",{{NONE}},NONE,builtin::_read);
static builtin::builtin _pp("++",{{NONE}},NONE,builtin::_pp);
static builtin::builtin _mm("--",{{NONE}},INT,builtin::_add);
static std::map<std::string, builtin::builtin*> builtins = {
static builtin::builtin _push("push",{{ARRAY,ANY}},ANY,builtin::_push); //WARN: all of these SHOULD return an array, figure it out
static builtin::builtin _pop("seta",{{ARRAY}},ANY,builtin::_pop);
static builtin::builtin _insert("insert",{{ARRAY,INT,ANY}},ANY,builtin::_insert);
static builtin::builtin _rem("rem",{{ARRAY, INT}},ANY,builtin::_rem); //WARN: up to here
static builtin::builtin _len("len",{{ARRAY}},INT,builtin::_len);
static builtin::builtin _tail("tail",{{ARRAY}},ANY,builtin::_tail);
static std::unordered_map<std::string, builtin::builtin*> builtins = {
{"write",&_write},{"exit",&_exit},{"if",&_if},{"__anon",&__anon},{"def",&_def},{"+",&_add}
,{"-",&_sub},{"*",&_mul},{"/",&_div},{"%",&_mod},{"get",&_get},{"geta",&_geta},{"set",&_set},{"==",&_equ},
{">",&_great},{"<",&_less},{">=",&_great_o_equ},{"<=",&_less_o_equ},{"!=",&_nequ},{"&&",&_and},
{"!",&_not},{"||",&_or},{"^",&_xor},{"defn",&_defn},{"udef",&_udef},{"seta",&_seta},{"++",&_pp},{"--",&_mm}
,{"type",&_type},{"read",&_read}
,{"type",&_type},{"read",&_read},{"push",&_push},{"pop",&_pop},{"insert",&_insert},{"rem",&_rem},{"len",&_len}
,{"tail",&_tail}
};
void ttest(lexi);

View File

@ -2,6 +2,8 @@
#include "pretty.hh"
object cast_o(object i, type t, state* s){
std::string out;
std::vector<object> oba;
if(t==i.type) return i;
if(i.type==STATEMENT&&t!=STATEMENT&&t!=ANON&&i.ident!="__anon"){
i = dtype(i,single_ex(i.n_value[0],s),builtins[i.n_value[0].oper]->_return,t);
@ -38,6 +40,20 @@ object cast_o(object i, type t, state* s){
i.value = std::to_string(std::get<int>(i.value));
break;
}
if(i.type==ARRAY){
i.type = STRING;
out = "{ ";
for(object o : std::get<std::vector<object>>(i.value)){
out += std::get<std::string>(cast_o(o,STRING,s).value) + ", ";
}
if(out!="{ "){
out[out.size()-1] = ' ';
out[out.size()-2] = ' ';
}
out+="}";
i.value = out;
break;
}
p_ferr("no avaliable converstion from "+std::to_string(i.type)+" to "+std::to_string(t),1);
break;
case STATEMENT:
@ -47,7 +63,19 @@ object cast_o(object i, type t, state* s){
case STATEMENTC:
case DOUBLE:
case REF:
break;
case ARRAY:
if(i.type==STRING){
i.type=ARRAY;
for(char c : std::get<std::string>(i.value)){
std::string a(1,c);
oba.push_back(object(a,a,STRING));
}
i.value = oba;
break;
}
p_ferr("no avaliable converstion from "+std::to_string(i.type)+" to "+std::to_string(t),1);
break;
case ANON:
case ANY:
case NUMBER:

View File

@ -7,7 +7,8 @@ int main(int argc, char* argv[]){
//std::cout<<batch_format(test("(exit 5 22)(meow \"wharrrr\" (a 5 (aaa 5.5) ) 445)"),0);
//std::cout<<batch_format(test(f_read("./test/if.ll")),0);
state state;
state.names = {{"true",object("true",1,INT)},{"true",object("false",0,INT)}};
state.names = {{"true",object("true",1,INT)},{"true",object("false",0,INT)},
{"maybe",object("maybe",1.5,DOUBLE)}};
interp(test(f_read(argv[1])),&state);
//std::cout<<batch_format(test(f_read(argv[1])),0);
//interp(test(f_read("./test/exit.ll")));

8
test/push.ll Normal file
View File

@ -0,0 +1,8 @@
(def uwu {5,4,3})
(def uwu (insert uwu 1 1))
(def uwu (rem uwu 0))
(write uwu)
(write (len uwu))
(write (tail uwu))
(write (len "uwu wowa"))