about summary refs log tree commit diff stats
path: root/apps/tile
diff options
context:
space:
mode:
authorKartik Agaram <vc@akkartik.com>2020-09-26 19:15:04 -0700
committerKartik Agaram <vc@akkartik.com>2020-09-26 19:15:04 -0700
commit11d3ce71462b192dcbec3daaa4762550cbec6dfe (patch)
treee42d0e299b1e7966f9c62f934ba15c9cc65add57 /apps/tile
parente0bceffe08e06a30e771efe986f1f4f7c717dc95 (diff)
downloadmu-11d3ce71462b192dcbec3daaa4762550cbec6dfe.tar.gz
6861 - tile: conventional repl
Diffstat (limited to 'apps/tile')
-rw-r--r--apps/tile/README.md8
-rw-r--r--apps/tile/environment.mu57
-rw-r--r--apps/tile/main.mu92
3 files changed, 119 insertions, 38 deletions
diff --git a/apps/tile/README.md b/apps/tile/README.md
index 9521bd8f..0f9bdc9a 100644
--- a/apps/tile/README.md
+++ b/apps/tile/README.md
@@ -2,7 +2,7 @@ To run:
 
 ```
 ./translate_mu apps/tile/*.mu
-./a.elf
+./a.elf screen
 ```
 
 To run tests:
@@ -10,3 +10,9 @@ To run tests:
 ```
 ./a.elf test
 ```
+
+To run a conventional REPL (for debugging):
+
+```
+./a.elf type
+```
diff --git a/apps/tile/environment.mu b/apps/tile/environment.mu
index 4caa37f1..906905d0 100644
--- a/apps/tile/environment.mu
+++ b/apps/tile/environment.mu
@@ -25,12 +25,22 @@ fn initialize-environment _env: (addr environment) {
   copy-to *dest, nrows
   dest <- get env, ncols
   copy-to *dest, ncols
-  ncols <- shift-right 1
+  var repl-col/ecx: int <- copy ncols
+  repl-col <- shift-right 1
   dest <- get env, code-separator-col
-  copy-to *dest, ncols
+  copy-to *dest, repl-col
+}
+
+fn draw-screen _env: (addr environment) {
+  var env/esi: (addr environment) <- copy _env
+  var screen-ah/eax: (addr handle screen) <- get env, screen
+  var _screen/eax: (addr screen) <- lookup *screen-ah
+  var screen/edi: (addr screen) <- copy _screen
+  var dest/edx: (addr int) <- get env, code-separator-col
+  var tmp/eax: int <- copy *dest
   clear-canvas env
-  ncols <- add 2  # repl-margin-left
-  move-cursor screen, 3, ncols  # input-row
+  tmp <- add 2  # repl-margin-left
+  move-cursor screen, 3, tmp  # input-row
 }
 
 fn initialize-environment-with-fake-screen _self: (addr environment), nrows: int, ncols: int {
@@ -42,18 +52,6 @@ fn initialize-environment-with-fake-screen _self: (addr environment), nrows: int
   initialize-environment self
 }
 
-fn render-loop _self: (addr environment) {
-  var self/esi: (addr environment) <- copy _self
-  $interactive:loop: {
-    var key/eax: grapheme <- read-key-from-real-keyboard
-    compare key, 0x71  # 'q'
-    break-if-=
-    process self, key
-    render self
-    loop
-  }
-}
-
 fn process _self: (addr environment), key: grapheme {
 $process:body: {
     var self/esi: (addr environment) <- copy _self
@@ -159,6 +157,23 @@ $process:body: {
 }
 }
 
+fn evaluate-environment _env: (addr environment), stack: (addr int-stack) {
+  var env/esi: (addr environment) <- copy _env
+  # program
+  var program-ah/eax: (addr handle program) <- get env, program
+  var _program/eax: (addr program) <- lookup *program-ah
+  var program/esi: (addr program) <- copy _program
+  # defs
+  var defs/edx: (addr handle function) <- get program, defs
+  # line
+  var sandbox-ah/esi: (addr handle sandbox) <- get program, sandboxes
+  var sandbox/eax: (addr sandbox) <- lookup *sandbox-ah
+  var line-ah/eax: (addr handle line) <- get sandbox, data
+  var _line/eax: (addr line) <- lookup *line-ah
+  var line/esi: (addr line) <- copy _line
+  evaluate defs, 0, line, 0, stack
+}
+
 fn render _env: (addr environment) {
   var env/esi: (addr environment) <- copy _env
   clear-canvas env
@@ -223,12 +238,6 @@ fn render-line screen: (addr screen), defs: (addr handle function), bindings: (a
 fn render-column screen: (addr screen), defs: (addr handle function), bindings: (addr table), scratch: (addr line), final-word: (addr word), top-row: int, left-col: int, cursor-word: (addr word), cursor-col-a: (addr int) -> right-col/ecx: int {
   var max-width/ecx: int <- copy 0
   {
-    # render stack for all but final column
-    var curr/eax: (addr word) <- copy final-word
-    var next-ah/eax: (addr handle word) <- get curr, next
-    var next/eax: (addr word) <- lookup *next-ah
-    compare next, 0
-    break-if-=
     # indent stack
     var indented-col/ebx: int <- copy left-col
     indented-col <- add 1  # margin-right - 2 for padding spaces
@@ -341,3 +350,7 @@ fn clear-canvas _env: (addr environment) {
   reset-formatting screen
   print-string screen, " tbd  "
 }
+
+fn real-grapheme? g: grapheme -> result/eax: boolean {
+  result <- copy 1  # true
+}
diff --git a/apps/tile/main.mu b/apps/tile/main.mu
index fdbb69ca..afefc4b5 100644
--- a/apps/tile/main.mu
+++ b/apps/tile/main.mu
@@ -2,17 +2,10 @@ fn main args-on-stack: (addr array addr array byte) -> exit-status/ebx: int {
   var args/eax: (addr array addr array byte) <- copy args-on-stack
   var len/ecx: int <- length args
   $main-body: {
-    # if no args, run in interactive mode
-    compare len, 1
-    {
-      break-if->
-      exit-status <- interactive args-on-stack
-      break $main-body
-    }
-    # else if single arg is 'test', run tests
     compare len, 2
     {
       break-if-!=
+      # if single arg is 'test', run tests
       var tmp/ecx: (addr addr array byte) <- index args, 1
       var tmp2/eax: boolean <- string-equal? *tmp, "test"
       compare tmp2, 0  # false
@@ -22,26 +15,95 @@ fn main args-on-stack: (addr array addr array byte) -> exit-status/ebx: int {
         exit-status <- copy 0  # TODO: get at Num-test-failures somehow
         break $main-body
       }
+      # if single arg is 'screen', run in full-screen mode
+      tmp2 <- string-equal? *tmp, "screen"
+      compare tmp2, 0  # false
+      {
+        break-if-=
+        interactive
+        exit-status <- copy 0
+        break $main-body
+      }
+      # if single arg is 'type', run in typewriter mode
+      tmp2 <- string-equal? *tmp, "type"
+      compare tmp2, 0  # false
+      {
+        break-if-=
+        repl
+        exit-status <- copy 0
+        break $main-body
+      }
     }
     # otherwise error message
-    print-string-to-real-screen "usage: tile\n"
-    print-string-to-real-screen "    or tile test\n"
+    print-string-to-real-screen "usage:\n"
+    print-string-to-real-screen "  to run tests: tile test\n"
+    print-string-to-real-screen "  full-screen mode: tile screen\n"
+    print-string-to-real-screen "  regular REPL: tile type\n"
     exit-status <- copy 1
   }
 }
 
-fn interactive args: (addr array addr array byte) -> exit-status/ebx: int {
+fn interactive {
   enable-screen-grid-mode
   enable-keyboard-immediate-mode
   var env-storage: environment
   var env/esi: (addr environment) <- address env-storage
   initialize-environment env
-  render-loop env
+  draw-screen env
+  {
+    var key/eax: grapheme <- read-key-from-real-keyboard
+    compare key, 0x71  # 'q'
+    break-if-=
+    process env, key
+    render env
+    loop
+  }
   enable-keyboard-type-mode
   enable-screen-type-mode
-  exit-status <- copy 0
 }
 
-fn real-grapheme? g: grapheme -> result/eax: boolean {
-  result <- copy 1  # true
+fn repl {
+  enable-keyboard-immediate-mode
+  var env-storage: environment
+  var env/esi: (addr environment) <- address env-storage
+  initialize-environment env
+  var stack-storage: int-stack
+  var stack/edi: (addr int-stack) <- address stack-storage
+  initialize-int-stack stack, 0x10
+  print-string-to-real-screen "> "
+  $repl:loop: {
+    var key/eax: grapheme <- read-key-from-real-keyboard
+    print-grapheme-to-real-screen key
+    compare key, 4  # ctrl-d
+    break-if-=
+    compare key, 0xa  # 'q'
+    {
+      break-if-!=
+      evaluate-environment env, stack
+      var empty?/eax: boolean <- int-stack-empty? stack
+      {
+        compare empty?, 0  # false
+        break-if-!=
+        var result/eax: int <- pop-int-stack stack
+        print-int32-decimal-to-real-screen result
+        print-string-to-real-screen "\n"
+      }
+      # clear line
+      var cursor-word-ah/ecx: (addr handle word) <- get env, cursor-word
+      var program-ah/eax: (addr handle program) <- get env, program
+      var _program/eax: (addr program) <- lookup *program-ah
+      var program/esi: (addr program) <- copy _program
+      var sandbox-ah/esi: (addr handle sandbox) <- get program, sandboxes
+      var sandbox/eax: (addr sandbox) <- lookup *sandbox-ah
+      var line-ah/eax: (addr handle line) <- get sandbox, data
+      var _line/eax: (addr line) <- lookup *line-ah
+      var line/esi: (addr line) <- copy _line
+      initialize-line line, cursor-word-ah
+      print-string-to-real-screen "> "
+      loop $repl:loop
+    }
+    process env, key
+    loop
+  }
+  enable-keyboard-type-mode
 }