diff --git a/examples/1p1.flsp b/examples/1p1.flsp
deleted file mode 100644
index 568f4e7..0000000
--- a/examples/1p1.flsp
+++ /dev/null
@@ -1,6 +0,0 @@
-(var a)
-(var b)
-(a 1)
-(b 1)
-(write (+ a b))
-(newline)
diff --git a/examples/hello_world.flsp b/examples/hello_world.flsp
index 467e9f1..4a71bd8 100755
--- a/examples/hello_world.flsp
+++ b/examples/hello_world.flsp
@@ -1,2 +1,2 @@
-(import console)
 (write "Hello world")
+(newline)
diff --git a/examples/tostr.flsp b/examples/tostr.flsp
new file mode 100644
index 0000000..1685e20
--- /dev/null
+++ b/examples/tostr.flsp
@@ -0,0 +1,6 @@
+(var:str a "1234")
+(var:int b (:int a))
+(write a)
+(newline)
+(write b)
+(newline)
diff --git a/src/byte_defs.h b/src/byte_defs.h
index 91f07a1..4462b2d 100755
--- a/src/byte_defs.h
+++ b/src/byte_defs.h
@@ -160,3 +160,6 @@ static inline FnSig *get_fnsig(Value *x){
   rval &= 0xFFFFFFFFFFFF; // 48bits - should be (mostly) fine
   return (void*)rval; 
 }
+
+extern Tag ntag;
+extern Tag atag;
diff --git a/src/config.h b/src/config.h
index 02bb349..bf05a9d 100755
--- a/src/config.h
+++ b/src/config.h
@@ -28,7 +28,7 @@
 // Debug logs
 // 0 : None
 // 1 : All misc debug logs
-#define LOG 0
+#define LOG 1
 
 // TODO : Automate this
 #define INTERPR
diff --git a/src/exec_common.c b/src/exec_common.c
index 69a4329..88a18e4 100644
--- a/src/exec_common.c
+++ b/src/exec_common.c
@@ -252,6 +252,37 @@ void print_ast(Statement *base){
 #endif
 }
 
+Value str_to_val(char *str, i32 len){
+  if(len < 0)
+    len = strlen(str);
+  Value retv;
+  retv.tag = (Tag){.is_array = 0, .type = T_str};
+#if LOG
+  printf("str (%d) : %s\n", len, str);
+#endif
+  if(len > 4){
+    u32 nstr = flisp_alloc(len);
+    if(!nstr){
+      retv.tag = ntag;
+      return retv;
+    }
+    retv.vstr.pos = nstr;
+    memcpy(get_addr(nstr),str,len);
+  }
+  else {
+    for(i32 i = 0; i < len; i++)
+      retv.vstr.str[i] = str[i];
+  }
+  retv.vstr.len = len;
+  return retv;
+}
+
+void clean_strval(Value str){
+  if(str.vstr.len < 5)
+    return;
+  flisp_free(str.vstr.pos);
+}
+
 // Lesser special functions
 
 Value is(Tag tag, Value b){
@@ -298,28 +329,80 @@ Value flt_to_fix(Value x){
   return x;
 }
 
+char tmpbuf[256];
+
 Value int_to_str(Value x){
-  runtime_err("TODO : int_to_str");
+  i32 len = snprintf(tmpbuf, 256, "%d", x.v4B.value);
+  len = len > 256 ? 256:len;
+  Value retv = str_to_val(tmpbuf, len);
+  return retv;
 }
 
 Value fix_to_str(Value x){
-  runtime_err("TODO : fix_to_str");
+  i32 len = snprintf(tmpbuf, 256, "%f", f2float(x.v4B.value));
+  len = len > 256 ? 256:len;
+  Value retv = str_to_val(tmpbuf, len);
+  return retv;
 }
 
 Value flt_to_str(Value x){
-  runtime_err("TODO : flt_to_str");
+  i32 len = snprintf(tmpbuf, 256, "%f", x.v4B.vfl);
+  len = len > 256 ? 256:len;
+  Value retv = str_to_val(tmpbuf, len);
+  return retv;
+}
+
+Value vstr_to(Value x, i32 type){
+  char *str;
+  Value retv;
+  if(x.vstr.len > 4)
+    str = get_addr(x.vstr.pos);
+  else
+    str = x.vstr.str;
+  char *nstr = malloc(x.vstr.len+1);
+  if(!nstr){
+    retv.tag = ntag;
+    clean_strval(x); 
+    return retv;
+  }
+  memcpy(nstr, str, x.vstr.len);
+  clean_strval(x); 
+  nstr[x.vstr.len] = '\0';
+  i32 ret = 0;
+  switch(type){
+    case T_int:
+      ret = sscanf(nstr, "%d", &retv.v4B.value);
+      break;
+    case T_fix:
+      ret = sscanf(nstr, "%f", &retv.v4B.vfl);
+      x.v4B.value = fix(x.v4B.vfl);
+      break;
+    case T_float:
+      ret = sscanf(nstr, "%f", &retv.v4B.vfl);
+      break;
+    default:
+      break;
+  }
+  free(nstr);
+  if(!ret){
+    retv.tag = ntag;
+    return retv;
+  }
+  retv.tag = (Tag){.is_array = 0, .type = type};
+
+  return retv;
 }
 
 Value str_to_int(Value x){
-
+  return vstr_to(x,T_int);
 }
 
 Value str_to_fix(Value x){
-
+  return vstr_to(x,T_fix);
 }
 
 Value str_to_flt(Value x){
-
+  return vstr_to(x,T_float);
 }
 
 // [from][to]
@@ -518,6 +601,7 @@ Value pop(Value a, Value b){
 Value write(Value a){
   switch(a.tag.type){
     case T_null:
+    case T_any:
       printf("null");
       break;
     case T_int:
@@ -530,15 +614,16 @@ Value write(Value a){
       printf("%f",a.v4B.vfl);
       break;
     case T_str:
-      // TODO replace strdup
       char *nstr;
+      nstr = malloc(a.vstr.len+1);
       if(a.vstr.len > 4){
         char *str = get_addr(a.vstr.pos);
-        nstr = strndup(str, a.vstr.len);
+        memcpy(nstr, str, a.vstr.len);
       }
       else{
-        nstr = strndup(a.vstr.str, 4);
+        memcpy(nstr, a.vstr.str, a.vstr.len);
       }
+      nstr[a.vstr.len] = '\0';
       printf("%s",nstr);
       free(nstr);
       break;
diff --git a/src/exec_common.h b/src/exec_common.h
index f3b35bb..c416280 100644
--- a/src/exec_common.h
+++ b/src/exec_common.h
@@ -46,4 +46,8 @@ Value is(Tag tag, Value b);
 
 Value cast(Tag tag, Value b);
 
+// Makes a copy of the string
+// If len < 0, will copy up to a '\0'
+Value str_to_val(char *str, i32 len);
+
 void symbol_map_add_bi(HashMap *map);
diff --git a/src/main.c b/src/main.c
new file mode 100644
index 0000000..58e0dec
--- /dev/null
+++ b/src/main.c
@@ -0,0 +1,66 @@
+/*
+* The fLisp parser and interpreter
+* Copyright (C) 2025 Fcalva 
+*
+* This program is free software; you can redistribute it and/or
+* modify it under the terms of the GNU General Public License
+* as published by the Free Software Foundation; either version 2
+* of the License, or (at your option) any later version.
+*
+* This program is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+* GNU General Public License for more details.
+* 
+* You should have received a copy of the GNU General Public License
+* along with this program; if not, see
+* <https://www.gnu.org/licenses/>.
+*/
+
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+
+#include "types.h"
+#include "tests.h"
+#include "code_defs.h"
+#include "parser.h"
+#include "interpreter.h"
+#include "exec_common.h"
+
+#include "y.tab.h"
+
+extern FILE *yyin;
+
+int main(int argc, char *argv[]){
+  i32 fpos = 1;
+ 
+  if(argc > 1){ 
+    if(!strcmp(argv[1], "--tests")){
+      fpos++;
+      do_tests();
+    }
+  }
+  if(argc > fpos) {
+    yyin = fopen(argv[fpos], "r"); 
+    if(!yyin){
+      fprintf(stderr,"Failed to open file \"%s\"", argv[1]);
+      exit(1);
+    }
+  }
+  else {
+    printf("fLisp interactive env - v0.1\nFcalva 2025\n");
+    printf("Under the terms of the GPL v3.0 license\n");
+    yyin = stdin;
+  }
+
+  alloc_init();
+
+  make_stack();
+  yyparse();
+  free_stack();
+
+  fclose(yyin);
+
+  return 0;
+}
diff --git a/src/parse_utils.c b/src/parse_utils.c
index eaa1ecb..5a9fd34 100644
--- a/src/parse_utils.c
+++ b/src/parse_utils.c
@@ -92,7 +92,11 @@ Statement *make_fconst(float val){
 }
 
 Statement *make_strconst(char *str){
-  
+  Statement *stat = &stack->statements[stack->curr_statement++];
+  stat->type = ST_Const;
+  i32 len = strcspn(str, "\"");
+  stat->cons = str_to_val(str, len); 
+  return stat;
 }
 
 Statement *declare(i32 type, Tag vtype, char *name, Statement *assign){
diff --git a/src/parser.h b/src/parser.h
index 5fe1da4..bd9beb8 100644
--- a/src/parser.h
+++ b/src/parser.h
@@ -48,6 +48,3 @@ Statement *add_block(Statement *block, Statement *add);
 Statement *make_operation(i32 type, Tag vtype, char *str, i32 nparam, ...);
 
 void set_entry_point(Statement *statement);
-
-extern Tag ntag;
-extern Tag atag;
diff --git a/src/parser.l b/src/parser.l
index 71ad0d6..a31d251 100644
--- a/src/parser.l
+++ b/src/parser.l
@@ -48,7 +48,6 @@
 
 \"[^"\n]*["\n]                        {
                                         yylval.st = make_strconst(yytext+1);
-                                        printf("STRCST : %s\n",yytext);
                                         return CST;
                                       }
 
diff --git a/src/parser.y b/src/parser.y
index 1d0f4cd..25be0ac 100644
--- a/src/parser.y
+++ b/src/parser.y
@@ -21,6 +21,7 @@
   #include <stdio.h>
   #include <string.h>
   #include <stdlib.h>
+
   #include "types.h"
   #include "tests.h"
   #include "code_defs.h"
@@ -144,38 +145,3 @@ void yyerror(char *s){
   fprintf(stderr, "Error : %s\n", s);
   exit(1);
 }
-
-extern FILE *yyin;
-
-int main(int argc, char *argv[]){
-  i32 fpos = 1;
- 
-  if(argc > 1){ 
-    if(!strcmp(argv[1], "--tests")){
-      fpos++;
-      do_tests();
-    }
-  }
-  if(argc > fpos) {
-    yyin = fopen(argv[fpos], "r"); 
-    if(!yyin){
-      fprintf(stderr,"Failed to open file \"%s\"", argv[1]);
-      exit(1);
-    }
-  }
-  else {
-    printf("fLisp interactive env - v0.1\nFcalva 2025\n");
-    printf("Under the terms of the GPL v3.0 license\n");
-    yyin = stdin;
-  }
-
-  alloc_init();
-
-  make_stack();
-  yyparse();
-  free_stack();
-
-  fclose(yyin);
-
-  return 0;
-}
diff --git a/src/tests.c b/src/tests.c
index a72b484..2b68c42 100644
--- a/src/tests.c
+++ b/src/tests.c
@@ -93,7 +93,7 @@ int t_flisp_alloc(){
 
 int t_flisp_realloc(){
   int err = 0;
-  u8 ref[10] = {1,2,3,4,5,6,7,8,9,10};
+  u8 ref[5] = {1,2,3,4,5};
   u32 pos0 = flisp_alloc(5);
   if(!pos0)
     return 1;
@@ -104,6 +104,7 @@ int t_flisp_realloc(){
     return 1;
   ptr0 = get_addr(pos0);
   err += memcmp(ptr0, ref, 5);
+  flisp_free(pos0);
   return err;
 }