diff options
author | Kartik K. Agaram <vc@akkartik.com> | 2021-03-06 23:15:27 -0800 |
---|---|---|
committer | Kartik K. Agaram <vc@akkartik.com> | 2021-03-06 23:15:27 -0800 |
commit | 8f01e2d5539635e6f1a9e5baefe0c5b0fafdf132 (patch) | |
tree | d7e8444378b094a79176464d7db2ae4ea54ad577 | |
parent | 7fef31d27214346ffba4214ba8da138c4713a950 (diff) | |
download | mu-8f01e2d5539635e6f1a9e5baefe0c5b0fafdf132.tar.gz |
7859
-rw-r--r-- | shell/eval.mu | 27 |
1 files 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 |