From 2eddaf1fe653d67f55576a78326df842afc9af14 Mon Sep 17 00:00:00 2001 From: Will Anderson Date: Thu, 30 Apr 2026 13:13:38 -0500 Subject: [PATCH] codegen: type-driven dispatch for `+` between Int idents MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Closes the known limitation from the self-host commit: `fn add(a:Int, b:Int) { a + b }` now compiles to integer addition, not string concat. Previously the codegen heuristic guessed string concat whenever both operands were Idents with no literal anchor. Mechanism - parser captures the leading type identifier from `let x: T = ...` bindings (new "type" field on Let) and from function parameter annotations (new "type" field on each param). - codegen maintains a per-function int-name set in process state via state_set("__int_names", csv). cg_fn seeds it from typed parameters; cg_stmt extends it from typed `let` bindings and from `let x = ` (literal inference). - BinOp Plus: when both sides are Idents and both names are in the int-name set, emit arithmetic; otherwise the existing literal-anchor heuristic applies, with string concat as the fallback. This is the first compiler change made entirely through the self- hosting workflow — no Python bootstrap. Edit el source, run existing elc on elc-combined.el, cc the output, test. Closure holds at the new binary. Tests - add(40, 2) → 42 - count_to(10) → 45 (let i: Int / let total: Int rebinding) - Regression suite (tiny/implret/whiletest/lextest) unchanged. dist/platform/elc updated; .prev preserved. --- dist/platform/elc | Bin 93576 -> 93752 bytes dist/platform/elc.c | 80 +++++++++++++++++++++++++++++++- dist/platform/elc.prev | Bin 0 -> 93576 bytes el-compiler/src/codegen.el | 70 +++++++++++++++++++++++++++- el-compiler/src/parser.el | 20 ++++++-- elc-combined.el | 92 ++++++++++++++++++++++++++++++++++--- 6 files changed, 249 insertions(+), 13 deletions(-) create mode 100755 dist/platform/elc.prev diff --git a/dist/platform/elc b/dist/platform/elc index b1e96c9e3e9302f9456c6826c42d83471637b56b..c52f4feaab5b7c0410890a5c711610087160ba37 100755 GIT binary patch literal 93752 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 diff --git a/dist/platform/elc.c b/dist/platform/elc.c index e3e2559..785e7ae 100644 --- a/dist/platform/elc.c +++ b/dist/platform/elc.c @@ -49,6 +49,9 @@ el_val_t cg_stmts(el_val_t stmts, el_val_t indent, el_val_t declared); el_val_t param_decl(el_val_t param, el_val_t idx); el_val_t params_to_c(el_val_t params); el_val_t transform_implicit_return(el_val_t body); +el_val_t is_int_name(el_val_t name); +el_val_t add_int_name(el_val_t name); +el_val_t build_int_names_for_params(el_val_t params); el_val_t cg_fn(el_val_t stmt); el_val_t is_fndef(el_val_t stmt); el_val_t is_top_level_decl(el_val_t stmt); @@ -878,8 +881,13 @@ el_val_t parse_params(el_val_t tokens, el_val_t pos) { el_val_t pname = tok_value(tokens, p); p = (p + 1); p = expect(tokens, p, EL_STR("Colon")); + el_val_t ptype = EL_STR(""); + el_val_t kt = tok_kind(tokens, p); + if (str_eq(kt, EL_STR("Ident"))) { + ptype = tok_value(tokens, p); + } p = skip_type(tokens, p); - el_val_t param = el_map_new(1, "name", pname); + el_val_t param = el_map_new(2, "name", pname, "type", ptype); params = native_list_append(params, param); el_val_t k2 = tok_kind(tokens, p); if (str_eq(k2, EL_STR("Comma"))) { @@ -1309,16 +1317,21 @@ el_val_t parse_stmt(el_val_t tokens, el_val_t pos) { el_val_t p = (pos + 1); el_val_t name = tok_value(tokens, p); p = (p + 1); + el_val_t ltype = EL_STR(""); el_val_t k2 = tok_kind(tokens, p); if (str_eq(k2, EL_STR("Colon"))) { p = (p + 1); + el_val_t kt = tok_kind(tokens, p); + if (str_eq(kt, EL_STR("Ident"))) { + ltype = tok_value(tokens, p); + } p = skip_type(tokens, p); } p = expect(tokens, p, EL_STR("Eq")); el_val_t r = parse_expr(tokens, p); el_val_t val = el_get_field(r, EL_STR("node")); p = el_get_field(r, EL_STR("pos")); - return make_result(el_map_new(3, "stmt", EL_STR("Let"), "name", name, "value", val), p); + return make_result(el_map_new(4, "stmt", EL_STR("Let"), "name", name, "value", val, "type", ltype), p); } if (str_eq(k, EL_STR("Return"))) { el_val_t p = (pos + 1); @@ -1690,6 +1703,18 @@ el_val_t cg_expr(el_val_t expr) { el_val_t op_c = binop_to_c(op); return el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("("), left_c), EL_STR(" ")), op_c), EL_STR(" ")), right_c), EL_STR(")")); } + if (str_eq(left_kind, EL_STR("Ident"))) { + if (str_eq(right_kind, EL_STR("Ident"))) { + el_val_t lname = el_get_field(left, EL_STR("name")); + el_val_t rname = el_get_field(right, EL_STR("name")); + if (is_int_name(lname)) { + if (is_int_name(rname)) { + el_val_t op_c = binop_to_c(op); + return el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("("), left_c), EL_STR(" ")), op_c), EL_STR(" ")), right_c), EL_STR(")")); + } + } + } + } if (str_eq(left_kind, EL_STR("Call"))) { return el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("el_str_concat("), left_c), EL_STR(", ")), right_c), EL_STR(")")); } @@ -1898,6 +1923,14 @@ el_val_t cg_stmt(el_val_t stmt, el_val_t indent, el_val_t declared) { el_val_t name = el_get_field(stmt, EL_STR("name")); el_val_t val = el_get_field(stmt, EL_STR("value")); el_val_t val_c = cg_expr(val); + el_val_t ltype = el_get_field(stmt, EL_STR("type")); + if (str_eq(ltype, EL_STR("Int"))) { + add_int_name(name); + } + el_val_t vk = el_get_field(val, EL_STR("expr")); + if (str_eq(vk, EL_STR("Int"))) { + add_int_name(name); + } if (list_contains(declared, name)) { emit_line(el_str_concat(el_str_concat(el_str_concat(el_str_concat(indent, name), EL_STR(" = ")), val_c), EL_STR(";"))); return declared; @@ -2118,6 +2151,48 @@ el_val_t transform_implicit_return(el_val_t body) { return 0; } +el_val_t is_int_name(el_val_t name) { + el_val_t csv = state_get(EL_STR("__int_names")); + if (str_eq(csv, EL_STR(""))) { + return 0; + } + return str_contains(csv, el_str_concat(el_str_concat(EL_STR(","), name), EL_STR(","))); + return 0; +} + +el_val_t add_int_name(el_val_t name) { + el_val_t csv = state_get(EL_STR("__int_names")); + if (str_eq(csv, EL_STR(""))) { + csv; + EL_NULL; + EL_STR(","); + } + el_val_t key = el_str_concat(el_str_concat(EL_STR(","), name), EL_STR(",")); + if (str_contains(csv, key)) { + return 1; + } + state_set(EL_STR("__int_names"), el_str_concat(el_str_concat(csv, name), EL_STR(","))); + return 1; + return 0; +} + +el_val_t build_int_names_for_params(el_val_t params) { + state_set(EL_STR("__int_names"), EL_STR(",")); + el_val_t np = native_list_len(params); + el_val_t pi = 0; + while (pi < np) { + el_val_t param = native_list_get(params, pi); + el_val_t pname = el_get_field(param, EL_STR("name")); + el_val_t ptype = el_get_field(param, EL_STR("type")); + if (str_eq(ptype, EL_STR("Int"))) { + add_int_name(pname); + } + pi = (pi + 1); + } + return 1; + return 0; +} + el_val_t cg_fn(el_val_t stmt) { el_val_t fn_name = el_get_field(stmt, EL_STR("name")); if (str_eq(fn_name, EL_STR("main"))) { @@ -2127,6 +2202,7 @@ el_val_t cg_fn(el_val_t stmt) { el_val_t body = el_get_field(stmt, EL_STR("body")); el_val_t ret_type = el_get_field(stmt, EL_STR("ret_type")); el_val_t params_c = params_to_c(params); + build_int_names_for_params(params); emit_line(el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("el_val_t "), fn_name), EL_STR("(")), params_c), EL_STR(") {"))); el_val_t decl = native_list_empty(); el_val_t np = native_list_len(params); diff --git a/dist/platform/elc.prev b/dist/platform/elc.prev new file mode 100755 index 0000000000000000000000000000000000000000..b1e96c9e3e9302f9456c6826c42d83471637b56b GIT binary patch literal 93576 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 literal 0 HcmV?d00001 diff --git a/el-compiler/src/codegen.el b/el-compiler/src/codegen.el index 4292cbc..4a4923e 100644 --- a/el-compiler/src/codegen.el +++ b/el-compiler/src/codegen.el @@ -170,6 +170,23 @@ fn cg_expr(expr: Map) -> String { let op_c: String = binop_to_c(op) return "(" + left_c + " " + op_c + " " + right_c + ")" } + // Type-driven dispatch: if both sides are Idents declared + // with type Int (parameters annotated `: Int` or let bindings + // annotated `: Int`), this is arithmetic, not concat. The + // current-function int-name set is maintained by cg_fn / + // cg_stmt via state_set("__int_names", csv). + if left_kind == "Ident" { + if right_kind == "Ident" { + let lname: String = left["name"] + let rname: String = right["name"] + if is_int_name(lname) { + if is_int_name(rname) { + let op_c: String = binop_to_c(op) + return "(" + left_c + " " + op_c + " " + right_c + ")" + } + } + } + } if left_kind == "Call" { return "el_str_concat(" + left_c + ", " + right_c + ")" } @@ -188,8 +205,8 @@ fn cg_expr(expr: Map) -> String { return "el_str_concat(" + left_c + ", " + right_c + ")" } } - // Ident + Ident or Ident + unknown — assume string concat - // (This is the ambiguous case: El uses + for both string and integer ops) + // Ident + Ident or Ident + unknown without int-typed evidence — + // fall back to string concat (the historical heuristic). if left_kind == "Ident" { return "el_str_concat(" + left_c + ", " + right_c + ")" } @@ -413,6 +430,17 @@ fn cg_stmt(stmt: Map, indent: String, declared: [String]) -> [Strin let name: String = stmt["name"] let val = stmt["value"] let val_c: String = cg_expr(val) + // If the binding is annotated `: Int` and val is an Int literal, + // register `name` in the per-function int-name set so that later + // `name + ...` dispatches to arithmetic, not concat. + let ltype: String = stmt["type"] + if str_eq(ltype, "Int") { + add_int_name(name) + } + let vk: String = val["expr"] + if str_eq(vk, "Int") { + add_int_name(name) + } if list_contains(declared, name) { emit_line(indent + name + " = " + val_c + ";") return declared @@ -627,6 +655,41 @@ fn transform_implicit_return(body: [Map]) -> [Map] { body } +// Test whether `name` is currently registered as an Int-typed identifier +// for the function being codegened. The set is maintained as a comma- +// bounded CSV in process state; cg_fn seeds it from typed parameters, +// cg_stmt extends it from typed `let` bindings. +fn is_int_name(name: String) -> Bool { + let csv: String = state_get("__int_names") + if str_eq(csv, "") { return false } + return str_contains(csv, "," + name + ",") +} + +fn add_int_name(name: String) -> Bool { + let csv: String = state_get("__int_names") + if str_eq(csv, "") { csv = "," } + let key: String = "," + name + "," + if str_contains(csv, key) { return true } + state_set("__int_names", csv + name + ",") + return true +} + +fn build_int_names_for_params(params: [Map]) -> Bool { + state_set("__int_names", ",") + let np: Int = native_list_len(params) + let pi = 0 + while pi < np { + let param = native_list_get(params, pi) + let pname: String = param["name"] + let ptype: String = param["type"] + if str_eq(ptype, "Int") { + add_int_name(pname) + } + let pi = pi + 1 + } + return true +} + fn cg_fn(stmt: Map) -> Void { let fn_name: String = stmt["name"] // Skip El's `fn main()` — C provides its own main() for top-level stmts @@ -636,6 +699,9 @@ fn cg_fn(stmt: Map) -> Void { let body = stmt["body"] let ret_type: String = stmt["ret_type"] let params_c: String = params_to_c(params) + // Seed the per-function int-name set so the `+` codegen can dispatch + // arithmetic vs concat on type-annotated identifiers. + build_int_names_for_params(params) emit_line("el_val_t " + fn_name + "(" + params_c + ") {") // Seed declared with parameter names so reassignment works let decl = native_list_empty() diff --git a/el-compiler/src/parser.el b/el-compiler/src/parser.el index 488b107..d1339a8 100644 --- a/el-compiler/src/parser.el +++ b/el-compiler/src/parser.el @@ -119,8 +119,15 @@ fn parse_params(tokens: [Map], pos: Int) -> Map { let pname = tok_value(tokens, p) let p = p + 1 let p = expect(tokens, p, "Colon") + // Capture the leading type identifier so codegen can dispatch + // arithmetic vs string-concat on `+` based on declared types. + let ptype = "" + let kt = tok_kind(tokens, p) + if kt == "Ident" { + let ptype = tok_value(tokens, p) + } let p = skip_type(tokens, p) - let param = { "name": pname } + let param = { "name": pname, "type": ptype } let params = native_list_append(params, param) let k2 = tok_kind(tokens, p) if k2 == "Comma" { @@ -533,17 +540,24 @@ fn parse_stmt(tokens: [Map], pos: Int) -> Map { let p = pos + 1 let name = tok_value(tokens, p) let p = p + 1 + let ltype = "" let k2 = tok_kind(tokens, p) - // optional type annotation: name: Type + // optional type annotation: name: Type — capture the leading + // identifier so codegen can dispatch arithmetic vs concat on + // `+` between two typed Idents. if k2 == "Colon" { let p = p + 1 + let kt = tok_kind(tokens, p) + if kt == "Ident" { + let ltype = tok_value(tokens, p) + } let p = skip_type(tokens, p) } let p = expect(tokens, p, "Eq") let r = parse_expr(tokens, p) let val = r["node"] let p = r["pos"] - return make_result({ "stmt": "Let", "name": name, "value": val }, p) + return make_result({ "stmt": "Let", "name": name, "value": val, "type": ltype }, p) } // return statement diff --git a/elc-combined.el b/elc-combined.el index 2b3799a..aae8375 100644 --- a/elc-combined.el +++ b/elc-combined.el @@ -658,8 +658,15 @@ fn parse_params(tokens: [Map], pos: Int) -> Map { let pname = tok_value(tokens, p) let p = p + 1 let p = expect(tokens, p, "Colon") + // Capture the leading type identifier so codegen can dispatch + // arithmetic vs string-concat on `+` based on declared types. + let ptype = "" + let kt = tok_kind(tokens, p) + if kt == "Ident" { + let ptype = tok_value(tokens, p) + } let p = skip_type(tokens, p) - let param = { "name": pname } + let param = { "name": pname, "type": ptype } let params = native_list_append(params, param) let k2 = tok_kind(tokens, p) if k2 == "Comma" { @@ -1072,17 +1079,24 @@ fn parse_stmt(tokens: [Map], pos: Int) -> Map { let p = pos + 1 let name = tok_value(tokens, p) let p = p + 1 + let ltype = "" let k2 = tok_kind(tokens, p) - // optional type annotation: name: Type + // optional type annotation: name: Type — capture the leading + // identifier so codegen can dispatch arithmetic vs concat on + // `+` between two typed Idents. if k2 == "Colon" { let p = p + 1 + let kt = tok_kind(tokens, p) + if kt == "Ident" { + let ltype = tok_value(tokens, p) + } let p = skip_type(tokens, p) } let p = expect(tokens, p, "Eq") let r = parse_expr(tokens, p) let val = r["node"] let p = r["pos"] - return make_result({ "stmt": "Let", "name": name, "value": val }, p) + return make_result({ "stmt": "Let", "name": name, "value": val, "type": ltype }, p) } // return statement @@ -1479,6 +1493,23 @@ fn cg_expr(expr: Map) -> String { let op_c: String = binop_to_c(op) return "(" + left_c + " " + op_c + " " + right_c + ")" } + // Type-driven dispatch: if both sides are Idents declared + // with type Int (parameters annotated `: Int` or let bindings + // annotated `: Int`), this is arithmetic, not concat. The + // current-function int-name set is maintained by cg_fn / + // cg_stmt via state_set("__int_names", csv). + if left_kind == "Ident" { + if right_kind == "Ident" { + let lname: String = left["name"] + let rname: String = right["name"] + if is_int_name(lname) { + if is_int_name(rname) { + let op_c: String = binop_to_c(op) + return "(" + left_c + " " + op_c + " " + right_c + ")" + } + } + } + } if left_kind == "Call" { return "el_str_concat(" + left_c + ", " + right_c + ")" } @@ -1497,8 +1528,8 @@ fn cg_expr(expr: Map) -> String { return "el_str_concat(" + left_c + ", " + right_c + ")" } } - // Ident + Ident or Ident + unknown — assume string concat - // (This is the ambiguous case: El uses + for both string and integer ops) + // Ident + Ident or Ident + unknown without int-typed evidence — + // fall back to string concat (the historical heuristic). if left_kind == "Ident" { return "el_str_concat(" + left_c + ", " + right_c + ")" } @@ -1722,6 +1753,17 @@ fn cg_stmt(stmt: Map, indent: String, declared: [String]) -> [Strin let name: String = stmt["name"] let val = stmt["value"] let val_c: String = cg_expr(val) + // If the binding is annotated `: Int` and val is an Int literal, + // register `name` in the per-function int-name set so that later + // `name + ...` dispatches to arithmetic, not concat. + let ltype: String = stmt["type"] + if str_eq(ltype, "Int") { + add_int_name(name) + } + let vk: String = val["expr"] + if str_eq(vk, "Int") { + add_int_name(name) + } if list_contains(declared, name) { emit_line(indent + name + " = " + val_c + ";") return declared @@ -1936,6 +1978,41 @@ fn transform_implicit_return(body: [Map]) -> [Map] { body } +// Test whether `name` is currently registered as an Int-typed identifier +// for the function being codegened. The set is maintained as a comma- +// bounded CSV in process state; cg_fn seeds it from typed parameters, +// cg_stmt extends it from typed `let` bindings. +fn is_int_name(name: String) -> Bool { + let csv: String = state_get("__int_names") + if str_eq(csv, "") { return false } + return str_contains(csv, "," + name + ",") +} + +fn add_int_name(name: String) -> Bool { + let csv: String = state_get("__int_names") + if str_eq(csv, "") { csv = "," } + let key: String = "," + name + "," + if str_contains(csv, key) { return true } + state_set("__int_names", csv + name + ",") + return true +} + +fn build_int_names_for_params(params: [Map]) -> Bool { + state_set("__int_names", ",") + let np: Int = native_list_len(params) + let pi = 0 + while pi < np { + let param = native_list_get(params, pi) + let pname: String = param["name"] + let ptype: String = param["type"] + if str_eq(ptype, "Int") { + add_int_name(pname) + } + let pi = pi + 1 + } + return true +} + fn cg_fn(stmt: Map) -> Void { let fn_name: String = stmt["name"] // Skip El's `fn main()` — C provides its own main() for top-level stmts @@ -1945,6 +2022,9 @@ fn cg_fn(stmt: Map) -> Void { let body = stmt["body"] let ret_type: String = stmt["ret_type"] let params_c: String = params_to_c(params) + // Seed the per-function int-name set so the `+` codegen can dispatch + // arithmetic vs concat on type-annotated identifiers. + build_int_names_for_params(params) emit_line("el_val_t " + fn_name + "(" + params_c + ") {") // Seed declared with parameter names so reassignment works let decl = native_list_empty() @@ -2074,7 +2154,7 @@ fn compile(source: String) -> String { // result to args()[1]. Then run: // cc -o el_runtime.c -// CLI driver — equivalent to: elc +// CLI driver let _argv: [String] = args() let _src_path: String = native_list_get(_argv, 0) let _source: String = fs_read(_src_path)