From 8f01e2d5539635e6f1a9e5baefe0c5b0fafdf132 Mon Sep 17 00:00:00 2001 From: "Kartik K. Agaram" Date: Sat, 6 Mar 2021 23:15:27 -0800 Subject: [PATCH] 7859 --- shell/eval.mu | 27 +++++++++++++++++++++++++-- 1 file changed, 25 insertions(+), 2 deletions(-) diff --git a/shell/eval.mu b/shell/eval.mu index 368e2836..d9fea7b4 100644 --- a/shell/eval.mu +++ b/shell/eval.mu @@ -82,17 +82,40 @@ fn evaluate _in: (addr handle cell), out: (addr handle cell), env: (addr cell), fn apply _f-ah: (addr handle cell), args-ah: (addr handle cell), out: (addr handle cell), env: (addr cell), trace: (addr trace) { var f-ah/eax: (addr handle cell) <- copy _f-ah - var f/eax: (addr cell) <- lookup *f-ah + var _f/eax: (addr cell) <- lookup *f-ah + var f/esi: (addr cell) <- copy _f + # call primitive functions { - var f-type/ecx: (addr int) <- get f, type + var f-type/eax: (addr int) <- get f, type compare *f-type, 4/primitive-function break-if-!= apply-primitive f, args-ah, out, env, trace return } + # if it's not a primitive function it must be an anonymous function + { + var f-type/ecx: (addr int) <- get f, type + compare *f-type, 0/pair + break-if-!= + var first-ah/eax: (addr handle cell) <- get f, left + var first/eax: (addr cell) <- lookup *first-ah + var is-fn?/eax: boolean <- is-fn? first + compare is-fn?, 0/false + break-if-= + trace-text trace, "eval", "apply anonymous function" + var rest-ah/esi: (addr handle cell) <- get f, right + var rest/eax: (addr cell) <- lookup *rest-ah + var params-ah/ecx: (addr handle cell) <- get rest, left + var body-ah/eax: (addr handle cell) <- get rest, right + apply-function params-ah, args-ah, body-ah, out, env, trace + return + } error trace, "unknown function" } +fn apply-function _params-ah: (addr handle cell), _args-ah: (addr handle cell), _body-ah: (addr handle cell), out: (addr handle cell), env: (addr cell), trace: (addr trace) { +} + fn apply-primitive _f: (addr cell), args-ah: (addr handle cell), out: (addr handle cell), env: (addr cell), trace: (addr trace) { var f/esi: (addr cell) <- copy _f var f-index/eax: (addr int) <- get f, index-data