about summary refs log tree commit diff stats
path: root/apps
diff options
context:
space:
mode:
authorKartik Agaram <vc@akkartik.com>2020-10-19 22:41:46 -0700
committerKartik Agaram <vc@akkartik.com>2020-10-19 22:41:46 -0700
commit5532ea013b6ee7f7aeda72d2ed592b7aa246a5f2 (patch)
treea83090f3b9069366acb9ef8774ae24f0f031d74e /apps
parent3ff287f410830345bea080703a2397b896dae277 (diff)
downloadmu-5532ea013b6ee7f7aeda72d2ed592b7aa246a5f2.tar.gz
7066 - tile: some more primitives for testing
Lesson learned: functions store args in _reverse_ order. Since evaluation
is very frequent, it's worth optimizing for it.
Diffstat (limited to 'apps')
-rw-r--r--apps/tile/data.mu87
-rw-r--r--apps/tile/environment.mu4
-rw-r--r--apps/tile/rpn.mu2
3 files changed, 93 insertions, 0 deletions
diff --git a/apps/tile/data.mu b/apps/tile/data.mu
index abfaabcc..44f2149b 100644
--- a/apps/tile/data.mu
+++ b/apps/tile/data.mu
@@ -261,6 +261,93 @@ fn create-primitive-functions _self: (addr handle function) {
   prev-word-ah <- get tmp, prev
   copy-object curr-word-ah, prev-word-ah
   tmp <- lookup *prev-word-ah
+  # x 1- = x 1 -
+  var next/esi: (addr handle function) <- get f, next
+  allocate next
+  var _f/eax: (addr function) <- lookup *next
+  var f/esi: (addr function) <- copy _f
+  var name-ah/eax: (addr handle array byte) <- get f, name
+  populate-text-with name-ah, "1-"
+  var args-ah/eax: (addr handle word) <- get f, args
+  allocate args-ah
+  var args/eax: (addr word) <- lookup *args-ah
+  initialize-word-with args, "x"
+  var body-ah/eax: (addr handle line) <- get f, body
+  allocate body-ah
+  var body/eax: (addr line) <- lookup *body-ah
+  initialize-line body
+  var curr-word-ah/ecx: (addr handle word) <- get body, data
+  # *curr-word = "x"
+  allocate curr-word-ah
+  var tmp/eax: (addr word) <- lookup *curr-word-ah
+  curr-word <- copy tmp
+  initialize-word-with curr-word, "x"
+  # *curr-word->next = "1"
+  next-word-ah <- get curr-word, next
+  allocate next-word-ah
+  tmp <- lookup *next-word-ah
+  initialize-word-with tmp, "1"
+  # *curr-word->next->prev = curr-word
+  prev-word-ah <- get tmp, prev
+  copy-object curr-word-ah, prev-word-ah
+  # curr-word = curr-word->next
+  curr-word-ah <- copy next-word-ah
+  curr-word <- copy tmp
+  # *curr-word->next = "-"
+  next-word-ah <- get curr-word, next
+  allocate next-word-ah
+  tmp <- lookup *next-word-ah
+  initialize-word-with tmp, "-"
+  # *curr-word->next->prev = curr-word
+  prev-word-ah <- get tmp, prev
+  copy-object curr-word-ah, prev-word-ah
+  tmp <- lookup *prev-word-ah
+  # x y sub = x y -
+  var next/esi: (addr handle function) <- get f, next
+  allocate next
+  var _f/eax: (addr function) <- lookup *next
+  var f/esi: (addr function) <- copy _f
+  var name-ah/eax: (addr handle array byte) <- get f, name
+  populate-text-with name-ah, "sub"
+  # critical lesson: args are stored in reverse order
+  var args-ah/eax: (addr handle word) <- get f, args
+  allocate args-ah
+  var args/eax: (addr word) <- lookup *args-ah
+  initialize-word-with args, "y"
+  var next-arg-ah/eax: (addr handle word) <- get args, next
+  allocate next-arg-ah
+  var next-arg/eax: (addr word) <- lookup *next-arg-ah
+  initialize-word-with next-arg, "x"
+  var body-ah/eax: (addr handle line) <- get f, body
+  allocate body-ah
+  var body/eax: (addr line) <- lookup *body-ah
+  initialize-line body
+  var curr-word-ah/ecx: (addr handle word) <- get body, data
+  # *curr-word = "x"
+  allocate curr-word-ah
+  var tmp/eax: (addr word) <- lookup *curr-word-ah
+  curr-word <- copy tmp
+  initialize-word-with curr-word, "x"
+  # *curr-word->next = "y"
+  next-word-ah <- get curr-word, next
+  allocate next-word-ah
+  tmp <- lookup *next-word-ah
+  initialize-word-with tmp, "y"
+  # *curr-word->next->prev = curr-word
+  prev-word-ah <- get tmp, prev
+  copy-object curr-word-ah, prev-word-ah
+  # curr-word = curr-word->next
+  curr-word-ah <- copy next-word-ah
+  curr-word <- copy tmp
+  # *curr-word->next = "-"
+  next-word-ah <- get curr-word, next
+  allocate next-word-ah
+  tmp <- lookup *next-word-ah
+  initialize-word-with tmp, "-"
+  # *curr-word->next->prev = curr-word
+  prev-word-ah <- get tmp, prev
+  copy-object curr-word-ah, prev-word-ah
+  tmp <- lookup *prev-word-ah
 }
 
 fn function-body functions: (addr handle function), _word: (addr handle word), out: (addr handle line) {
diff --git a/apps/tile/environment.mu b/apps/tile/environment.mu
index 88035bcc..1017edd5 100644
--- a/apps/tile/environment.mu
+++ b/apps/tile/environment.mu
@@ -1258,6 +1258,10 @@ fn clear-canvas _env: (addr environment) {
   print-string screen, "x 2+ = x 1+ 1+"
   move-cursor screen, 6, 2
   print-string screen, "x square = x x *"
+  move-cursor screen, 7, 2
+  print-string screen, "x 1- = x 1 -"
+  move-cursor screen, 8, 2
+  print-string screen, "x y sub = x y -"
 }
 
 fn real-grapheme? g: grapheme -> result/eax: boolean {
diff --git a/apps/tile/rpn.mu b/apps/tile/rpn.mu
index 7c894f55..44108580 100644
--- a/apps/tile/rpn.mu
+++ b/apps/tile/rpn.mu
@@ -183,6 +183,8 @@ fn perform-call _callee: (addr function), caller-stack: (addr value-stack), func
   push-int-to-value-stack caller-stack, result
 }
 
+# pop args from the caller-stack and bind them to successive args
+# implies: function args are stored in reverse order
 fn bind-args _callee: (addr function), caller-stack: (addr value-stack), table: (addr table) {
   var callee/ecx: (addr function) <- copy _callee
   var curr-arg-ah/eax: (addr handle word) <- get callee, args
a id='n68' href='#n68'>68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140