From 11d3ce71462b192dcbec3daaa4762550cbec6dfe Mon Sep 17 00:00:00 2001 From: Kartik Agaram Date: Sat, 26 Sep 2020 19:15:04 -0700 Subject: 6861 - tile: conventional repl --- apps/tile/README.md | 8 ++++- apps/tile/environment.mu | 57 ++++++++++++++++++------------ apps/tile/main.mu | 92 ++++++++++++++++++++++++++++++++++++++++-------- 3 files changed, 119 insertions(+), 38 deletions(-) (limited to 'apps/tile') 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 } -- cgit 1.4.1-2-gfad0