diff --git a/regression/test064.expr b/regression/test064.expr index 018d3d214..9097b1ab1 100644 --- a/regression/test064.expr +++ b/regression/test064.expr @@ -1,4 +1,4 @@ -infixr "++" at "+" (a, b) {return a+b} +infix "++" at "+" (a, b) {return a+b} local x = read (); diff --git a/runtime/Std.i b/runtime/Std.i index 0a7ba6b8a..1e8945def 100644 --- a/runtime/Std.i +++ b/runtime/Std.i @@ -1,3 +1,6 @@ F,printf; F,read; F,write; +F,i__Infix_4343; +L,"++",T,"+"; + diff --git a/runtime/runtime.c b/runtime/runtime.c index a49cec747..efe6b7de1 100644 --- a/runtime/runtime.c +++ b/runtime/runtime.c @@ -163,6 +163,17 @@ static void printValue (void *p) { case STRING_TAG: printStringBuf ("\"%s\"", a->contents); break; + + case CLOSURE_TAG: + printStringBuf ("tag); i++) { + if (i) printValue ((void*)((int*) a->contents)[i]); + else printStringBuf ("%x", (void*)((int*) a->contents)[i]); + + if (i != LEN(a->tag) - 1) printStringBuf (", "); + } + printStringBuf (">"); + break; case ARRAY_TAG: printStringBuf ("["); @@ -445,12 +456,25 @@ extern int Lraw (int x) { extern void Lprintf (char *s, ...) { va_list args = (va_list) BOX (NULL); + //void *p = &s; + //char *c = s; + + //printf ("%d\n", ((int*)p)[2]); + /* + while (*c) { + if (*c == '%') { + p++; + printf ("arg: %d\n", *(int*)p); + } + c++; + } + */ va_start (args, s); vprintf (s, args); // vprintf (char *, va_list) <-> printf (char *, ...) va_end (args); } -extern void* Lstrcat (void *a, void *b) { +extern void* /*Lstrcat*/ i__Infix_4343 (void *a, void *b) { data *da = (data*) BOX (NULL); data *db = (data*) BOX (NULL); data *d = (data*) BOX (NULL); diff --git a/src/Language.ml b/src/Language.ml index 1bec29a46..1ad4b4b07 100644 --- a/src/Language.ml +++ b/src/Language.ml @@ -589,7 +589,7 @@ module Expr = ignore atr ( match s with | ":" -> Sexp ("cons", [x; y]) - | "++" -> Call (Var "strcat", [x; y]) + (*| "++" -> Call (Var "strcat", [x; y]) *) | ":=" -> Assign (x, y) | _ -> Binop (s, x, y) ) @@ -734,7 +734,7 @@ module Infix = let exported = Array.map (fun (ass, (_, ops)) -> - (ass, List.map (fun (s, kind, _) -> s, kind) @@ List.filter (function (_, Public, _) | (_, Predefined, _) -> true | _ -> false) ops) + (ass, List.rev @@ List.map (fun (s, kind, _) -> s, kind) @@ List.filter (function (_, Public, _) | (_, Predefined, _) -> true | _ -> false) ops) ) infix in @@ -746,11 +746,11 @@ module Infix = | (s, kind) :: tl -> let loc' = match tl with [] -> `After s | _ -> `At s in (fun again -> - match kind with - | Public -> again (loc', (ass, s, loc) :: acc) - | _ -> again (loc', acc) + match kind with + | Public -> again (loc', (ass, s, loc) :: acc) + | _ -> again (loc', acc) ) - (match tl with [] -> fun acc -> acc | _ -> fun acc -> inner acc tl) + (match tl with [] -> fun acc -> acc | _ -> fun acc -> inner acc tl) in inner (loc, acc) list ) @@ -770,7 +770,7 @@ module Infix = `Lefta , ["!!"]; `Lefta , ["&&"]; `Nona , ["=="; "!="; "<="; "<"; ">="; ">"]; - `Lefta , ["++"; "+" ; "-"]; + `Lefta , [(*"++";*) "+" ; "-"]; `Lefta , ["*" ; "/"; "%"]; |] @@ -838,7 +838,7 @@ module Definition = ostap ( arg : LIDENT; position[pub][ass][coord][newp]: - %"at" s:STRING {Infix.at coord (unquote s) newp pub} + %"at" s:STRING {match ass with `Nona -> Infix.at coord (unquote s) newp pub | _ -> raise (Semantic_error (Printf.sprintf "associativity for infxi '%s' can not be specified (it is inherited from that for '%s')" newp s))} | f:(%"before" {Infix.before} | %"after" {Infix.after}) s:STRING {f coord (unquote s) newp ass pub}; head[infix]: m:(%"external" {`Extern} | %"public" e:(%"external")? {match e with None -> `Public | _ -> `PublicExtern})? %"fun" name:LIDENT {unopt_mod m, name, name, infix} @@ -963,13 +963,13 @@ let eval (_, expr) i = (* Top-level parser *) ostap ( imports[cmd]: l:$ is:(%"import" !(Util.list (ostap (LIDENT))) -";")* { - let is = List.flatten is in + let is = "Std" :: List.flatten is in let infix = List.fold_left (fun infix import -> List.fold_left (fun infix item -> - let insert name infix md = + let insert name infix md = let name = Expr.infix_name name in match md (Expr.sem name) infix with | `Ok infix' -> infix' diff --git a/src/SM.ml b/src/SM.ml index 264bbeed3..9b039d031 100644 --- a/src/SM.ml +++ b/src/SM.ml @@ -360,7 +360,7 @@ object (self : 'self) intfs ) self - ("Std" :: imports) + imports in env diff --git a/src/X86.ml b/src/X86.ml index 827e4bab6..06ca2f4eb 100644 --- a/src/X86.ml +++ b/src/X86.ml @@ -687,19 +687,10 @@ let build cmd prog = List.filter (function `Import _ -> true | _ -> false) intfs) @ imports) in - iterate [] S.empty imports + iterate [] (S.add "Std" S.empty) imports in cmd#dump_file "s" (genasm cmd prog); cmd#dump_file "i" (Interface.gen prog); - (* - let name = Filename.chop_suffix cmd#get_infile ".expr" in - let outf = open_out (Printf.sprintf "%s.s" name) in - Printf.fprintf outf "%s" (genasm cmd prog); - close_out outf; - let outf = open_out (Printf.sprintf "%s.i" name) in - Printf.fprintf outf "%s" (Interface.gen prog); - close_out outf; - *) let inc = try Sys.getenv "RC_RUNTIME" with _ -> "../runtime" in match cmd#get_mode with | `Default ->