about summary refs log tree commit diff stats
path: root/shell/eval.mu
diff options
context:
space:
mode:
authorKartik K. Agaram <vc@akkartik.com>2021-03-06 23:15:27 -0800
committerKartik K. Agaram <vc@akkartik.com>2021-03-06 23:15:27 -0800
commit8f01e2d5539635e6f1a9e5baefe0c5b0fafdf132 (patch)
treed7e8444378b094a79176464d7db2ae4ea54ad577 /shell/eval.mu
parent7fef31d27214346ffba4214ba8da138c4713a950 (diff)
downloadmu-8f01e2d5539635e6f1a9e5baefe0c5b0fafdf132.tar.gz
7859
Diffstat (limited to 'shell/eval.mu')
-rw-r--r--shell/eval.mu27
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