From 60d607cb592c88f143f281cae552e2a6c8dd0e81 Mon Sep 17 00:00:00 2001 From: Emin Arslan Date: Sun, 17 May 2026 20:45:49 +0300 Subject: [PATCH] compiler and vm: added subtraction --- lib/compiler/scope_analysis.ml | 3 ++- lib/vm/native.ml | 18 ++++++++++++++---- 2 files changed, 16 insertions(+), 5 deletions(-) diff --git a/lib/compiler/scope_analysis.ml b/lib/compiler/scope_analysis.ml index 100e859..7b59bf1 100644 --- a/lib/compiler/scope_analysis.ml +++ b/lib/compiler/scope_analysis.ml @@ -58,7 +58,8 @@ type expression = let default_global_table = SymbolTable.of_list [ ("PRINT", (0, Native 0)); - ("ADD", (1, Native 1)) + ("+", (1, Native 1)); + ("-", (2, Native 2)) ] (* extract all defined global symbols, given the top-level expressions diff --git a/lib/vm/native.ml b/lib/vm/native.ml index ed16107..9072e71 100644 --- a/lib/vm/native.ml +++ b/lib/vm/native.ml @@ -23,20 +23,30 @@ let numeric_add = function | NDouble x -> (function | NInt y -> NDouble (x+.(float_of_int y)) | NDouble y -> NDouble (x+.y)) - +let numeric_sub = function + | NInt x -> (function + | NInt y -> NInt (x - y) + | NDouble y -> NDouble ((float_of_int x) -. y)) + | NDouble x -> (function + | NInt y -> NDouble (x-.(float_of_int y)) + | NDouble y -> NDouble (x-.y)) let builtin_print (v : Types.value ref list) = List.iter (fun r -> print_endline (print_value !r)) v; Types.Nil - - let builtin_add (vs : Types.value ref list) = of_numeric (List.fold_left numeric_add (NInt 0) (List.map (fun r -> to_numeric !r) vs)) +let builtin_sub (vs : Types.value ref list) = + match vs with + | f :: rest -> of_numeric (List.fold_left numeric_sub (to_numeric !f) (List.map (fun r -> to_numeric !r) rest)) + | [] -> failwith "invalid number of arguments for subtraction" + let table = [| builtin_print; - builtin_add + builtin_add; + builtin_sub |]