From 95780bd06cf189146a1662d4f37351803bd61038 Mon Sep 17 00:00:00 2001 From: Nat Quayle Nelson Date: Fri, 12 Sep 2025 20:51:44 -0500 Subject: [PATCH] implement method/function call --- src/kiss/KissInterp2.kiss | 22 +++++++++++++++++++++- src/test/cases/KissInterp2TestCase.hx | 3 +++ src/test/cases/KissInterp2TestCase.kiss | 7 +++++++ 3 files changed, 31 insertions(+), 1 deletion(-) diff --git a/src/kiss/KissInterp2.kiss b/src/kiss/KissInterp2.kiss index ffee7cd..872b00f 100644 --- a/src/kiss/KissInterp2.kiss +++ b/src/kiss/KissInterp2.kiss @@ -47,6 +47,17 @@ // Special form call ((when (specialForms.exists form) (CallExp (object def (Symbol form)) args)) ((dictGet specialForms form) args cc)) + // Method/function call + ((CallExp callable args) + (evalCC callable ->f + (_evalAllCC args ->values + (case callable + // Method call + ((object def (FieldExp field obj safe)) + (evalCC obj ->o + (cc (Reflect.callMethod o f values)))) + // Function call + (otherwise (cc (Reflect.callMethod null f values))))))) // Field access ((FieldExp field obj safe) (evalCC obj ->v @@ -80,4 +91,13 @@ (return)))) (cc (dictGet globals ident))) (never otherwise))) - (otherwise (throw "Can't interpret ${input}")))) \ No newline at end of file + (otherwise (throw "Can't interpret ${input}")))) + +(method :Void _evalAllCC [:Array inputs :Array->Void cc &opt :Array outputs] + (unless outputs (set outputs [])) + (if inputs + (evalCC (inputs.shift) ->v { + (outputs.push v) + (_evalAllCC inputs cc outputs) + }) + (cc outputs))) \ No newline at end of file diff --git a/src/test/cases/KissInterp2TestCase.hx b/src/test/cases/KissInterp2TestCase.hx index 4d13da5..6fee990 100644 --- a/src/test/cases/KissInterp2TestCase.hx +++ b/src/test/cases/KissInterp2TestCase.hx @@ -22,4 +22,7 @@ class KissInterp2TestCase extends Test { function testField() { _testField(); } + function testCallMethod() { + _testCallMethod(); + } } \ No newline at end of file diff --git a/src/test/cases/KissInterp2TestCase.kiss b/src/test/cases/KissInterp2TestCase.kiss index f295305..da5a7e2 100644 --- a/src/test/cases/KissInterp2TestCase.kiss +++ b/src/test/cases/KissInterp2TestCase.kiss @@ -16,3 +16,10 @@ (dictSet interp.globals "obj" (object a 5 b (object c 3))) (assertEval 5 "obj.a") (assertEval 3 "obj.b.c"))) + +(function _testCallMethod [] + (let [interp (new Interp)] + (dictSet interp.globals "f" ->[a b] (+ a b)) + (dictSet interp.globals "o" (object f ->[a b] (- a b))) + (assertEval 2 "(f -1 3)") + (assertEval 2 "(o.f 5 3)")))