implement method/function call
Some checks failed
CI / test-core (14, ubuntu-latest, 3.x, js) (push) Successful in 48s
CI / test-core (14, ubuntu-latest, 3.x, interp) (push) Successful in 1m2s
CI / test-core (14, ubuntu-latest, 3.x, nodejs) (push) Successful in 57s
CI / test-core (14, ubuntu-latest, 3.x, cpp) (push) Successful in 1m49s
CI / test-core (14, ubuntu-latest, 3.x, py) (push) Failing after 1m19s

This commit is contained in:
2025-09-12 20:51:44 -05:00
parent 269156dd09
commit 95780bd06c
3 changed files with 31 additions and 1 deletions

View File

@@ -47,6 +47,17 @@
// Special form call // Special form call
((when (specialForms.exists form) (CallExp (object def (Symbol form)) args)) ((when (specialForms.exists form) (CallExp (object def (Symbol form)) args))
((dictGet specialForms form) args cc)) ((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 // Field access
((FieldExp field obj safe) ((FieldExp field obj safe)
(evalCC obj ->v (evalCC obj ->v
@@ -81,3 +92,12 @@
(cc (dictGet globals ident))) (cc (dictGet globals ident)))
(never otherwise))) (never otherwise)))
(otherwise (throw "Can't interpret ${input}")))) (otherwise (throw "Can't interpret ${input}"))))
(method :Void _evalAllCC [:Array<Dynamic> inputs :Array<Dynamic>->Void cc &opt :Array<Dynamic> outputs]
(unless outputs (set outputs []))
(if inputs
(evalCC (inputs.shift) ->v {
(outputs.push v)
(_evalAllCC inputs cc outputs)
})
(cc outputs)))

View File

@@ -22,4 +22,7 @@ class KissInterp2TestCase extends Test {
function testField() { function testField() {
_testField(); _testField();
} }
function testCallMethod() {
_testCallMethod();
}
} }

View File

@@ -16,3 +16,10 @@
(dictSet interp.globals "obj" (object a 5 b (object c 3))) (dictSet interp.globals "obj" (object a 5 b (object c 3)))
(assertEval 5 "obj.a") (assertEval 5 "obj.a")
(assertEval 3 "obj.b.c"))) (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)")))