From 9542bb112419d575190a72baf7f964c3e32df223 Mon Sep 17 00:00:00 2001 From: "Kartik K. Agaram" Date: Sat, 25 Jul 2015 22:15:51 -0700 Subject: 1853 --- html/edit.mu.html | 335 +++++++++++++++++++++++++++++++++++++++++------------- 1 file changed, 253 insertions(+), 82 deletions(-) (limited to 'html/edit.mu.html') diff --git a/html/edit.mu.html b/html/edit.mu.html index fd76d06c..f86b4c35 100644 --- a/html/edit.mu.html +++ b/html/edit.mu.html @@ -13,15 +13,15 @@ pre { white-space: pre-wrap; font-family: monospace; color: #eeeeee; background-color: #080808; } body { font-family: monospace; color: #eeeeee; background-color: #080808; } * { font-size: 1.05em; } -.muRecipe { color: #ff8700; } -.Delimiter { color: #a04060; } .muScenario { color: #00af00; } .SalientComment { color: #00ffff; } +.Delimiter { color: #a04060; } +.CommentedCode { color: #6c6c6c; } .Comment { color: #9090ff; } .Constant { color: #00a0a0; } .Special { color: #ff6060; } -.CommentedCode { color: #6c6c6c; } .muControl { color: #c0a020; } +.muRecipe { color: #ff8700; } --> @@ -37,12 +37,15 @@ body { font-family: monospace; color: #eeeeee; background-color: #080808; } recipe main [ local-scope - open-console #? 1 + open-console initial-recipe:address:array:character <- restore [recipes.mu] -#? $exit #? 1 - initial-sandbox:address:array:character <- new [test 2, 2] + initial-sandbox:address:array:character <- new [] env:address:programming-environment-data <- new-programming-environment 0:literal/screen, initial-recipe:address:array:character, initial-sandbox:address:array:character + env:address:programming-environment-data <- restore-sandboxes env:address:programming-environment-data + render-all 0:literal/screen, env:address:programming-environment-data + show-screen 0:literal/screen event-loop 0:literal/screen, 0:literal/console, env:address:programming-environment-data + # never gets here ] container programming-environment-data [ @@ -687,8 +690,8 @@ container editor-data [ do-run?:boolean <- equal k:address:number/deref, 65526:literal/F10 break-unless do-run?:boolean run-sandboxes env:address:programming-environment-data - screen:address <- render-sandbox-side screen:address, env:address:programming-environment-data - # F10 doesn't mess with the recipe side + # F10 might update warnings and results on both sides + screen:address <- render-all screen:address, env:address:programming-environment-data update-cursor screen:address, recipes:address:editor-data, current-sandbox:address:editor-data, sandbox-in-focus?:address:boolean/deref show-screen screen:address loop +next-event:label @@ -1165,8 +1168,8 @@ container editor-data [ local-scope screen:address <- next-ingredient env:address:programming-environment-data <- next-ingredient - screen:address <- render-recipes screen:address, env:address:programming-environment-data - screen:address <- render-sandbox-side screen:address, env:address:programming-environment-data + screen:address <- render-recipes screen:address, env:address:programming-environment-data, 1:literal/clear-below + screen:address <- render-sandbox-side screen:address, env:address:programming-environment-data, 1:literal/clear-below recipes:address:editor-data <- get env:address:programming-environment-data/deref, recipes:offset current-sandbox:address:editor-data <- get env:address:programming-environment-data/deref, current-sandbox:offset sandbox-in-focus?:boolean <- get env:address:programming-environment-data/deref, sandbox-in-focus?:offset @@ -1203,6 +1206,7 @@ container editor-data [ local-scope screen:address <- next-ingredient env:address:programming-environment-data <- next-ingredient + clear:boolean <- next-ingredient recipes:address:editor-data <- get env:address:programming-environment-data/deref, recipes:offset # render recipes left:number <- get recipes:address:editor-data/deref, left:offset @@ -1225,26 +1229,7 @@ container editor-data [ row:number <- add row:number, 1:literal move-cursor screen:address, row:number, left:number clear-line-delimited screen:address, left:number, right:number - reply screen:address/same-as-ingredient:0 -] - -recipe render-sandbox-side [ - local-scope - screen:address <- next-ingredient - env:address:programming-environment-data <- next-ingredient - clear:boolean <- next-ingredient - current-sandbox:address:editor-data <- get env:address:programming-environment-data/deref, current-sandbox:offset - left:number <- get current-sandbox:address:editor-data/deref, left:offset - right:number <- get current-sandbox:address:editor-data/deref, right:offset - row:number, screen:address <- render screen:address, current-sandbox:address:editor-data - row:number <- add row:number, 1:literal - draw-horizontal screen:address, row:number, left:number, right:number, 9473:literal/horizontal-double - sandbox:address:sandbox-data <- get env:address:programming-environment-data/deref, sandbox:offset - row:number, screen:address <- render-sandboxes screen:address, sandbox:address:sandbox-data, left:number, right:number, row:number - # clear next line, in case we just processed a backspace - row:number <- add row:number, 1:literal - move-cursor screen:address, row:number, left:number - clear-line-delimited screen:address, left:number, right:number + # clear rest of screen in this column, if requested reply-unless clear:boolean, screen:address/same-as-ingredient:0 screen-height:number <- screen-height screen:address { @@ -1258,58 +1243,6 @@ container editor-data [ reply screen:address/same-as-ingredient:0 ] -recipe render-sandboxes [ - local-scope - screen:address <- next-ingredient - sandbox:address:sandbox-data <- next-ingredient - left:number <- next-ingredient - right:number <- next-ingredient - row:number <- next-ingredient - reply-unless sandbox:address:sandbox-data, row:number/same-as-ingredient:4, screen:address/same-as-ingredient:0 - screen-height:number <- screen-height screen:address - at-bottom?:boolean <- greater-or-equal row:number screen-height:number - reply-if at-bottom?:boolean, row:number/same-as-ingredient:4, screen:address/same-as-ingredient:0 -#? $print [rendering sandbox ], sandbox:address:sandbox-data, 10:literal/newline - # render sandbox menu - row:number <- add row:number, 1:literal - move-cursor screen:address, row:number, left:number - clear-line-delimited screen:address, left:number, right:number - print-character screen:address, 120:literal/x, 245:literal/grey - # save menu row so we can detect clicks to it later - starting-row:address:number <- get-address sandbox:address:sandbox-data/deref, starting-row-on-screen:offset - starting-row:address:number/deref <- copy row:number - # render sandbox contents - sandbox-data:address:array:character <- get sandbox:address:sandbox-data/deref, data:offset - row:number, screen:address <- render-string screen:address, sandbox-data:address:array:character, left:number, right:number, 7:literal/white, row:number - # render sandbox warnings, screen or response, in that order - sandbox-response:address:array:character <- get sandbox:address:sandbox-data/deref, response:offset - sandbox-warnings:address:array:character <- get sandbox:address:sandbox-data/deref, warnings:offset - sandbox-screen:address <- get sandbox:address:sandbox-data/deref, screen:offset - { - break-unless sandbox-warnings:address:array:character - row:number, screen:address <- render-string screen:address, sandbox-warnings:address:array:character, left:number, right:number, 1:literal/red, row:number - } - { - break-if sandbox-warnings:address:array:character - empty-screen?:boolean <- fake-screen-is-clear? sandbox-screen:address - break-if empty-screen?:boolean - row:number, screen:address <- render-screen screen:address, sandbox-screen:address, left:number, right:number, row:number - } - { - break-if sandbox-warnings:address:array:character - break-unless empty-screen?:boolean - row:number, screen:address <- render-string screen:address, sandbox-response:address:array:character, left:number, right:number, 245:literal/grey, row:number - } - at-bottom?:boolean <- greater-or-equal row:number screen-height:number - reply-if at-bottom?:boolean, row:number/same-as-ingredient:4, screen:address/same-as-ingredient:0 - # draw solid line after sandbox - draw-horizontal screen:address, row:number, left:number, right:number, 9473:literal/horizontal-double - # draw next sandbox - next-sandbox:address:sandbox-data <- get sandbox:address:sandbox-data/deref, next-sandbox:offset - row:number, screen:address <- render-sandboxes screen:address, next-sandbox:address:sandbox-data, left:number, right:number, row:number - reply row:number/same-as-ingredient:4, screen:address/same-as-ingredient:0 -] - recipe update-cursor [ local-scope screen:address <- next-ingredient @@ -2593,6 +2526,7 @@ d] ] scenario point-at-multiple-editors [ + $close-trace assume-screen 30:literal/width, 5:literal/height # initialize both halves of screen 1:address:array:character <- new [abc] @@ -2618,6 +2552,7 @@ d] ] scenario edit-multiple-editors [ + $close-trace assume-screen 30:literal/width, 5:literal/height # initialize both halves of screen 1:address:array:character <- new [abc] @@ -2660,6 +2595,7 @@ d] ] scenario multiple-editors-cover-only-their-own-areas [ + $close-trace assume-screen 60:literal/width, 10:literal/height run [ 1:address:array:character <- new [abc] @@ -2677,6 +2613,7 @@ d] ] scenario editor-in-focus-keeps-cursor [ + $close-trace assume-screen 30:literal/width, 5:literal/height 1:address:array:character <- new [abc] 2:address:array:character <- new [def] @@ -2809,6 +2746,8 @@ container sandbox-data [ save [recipes.mu], in:address:array:character recipe-warnings:address:address:array:character <- get-address env:address:programming-environment-data/deref, recipe-warnings:offset recipe-warnings:address:address:array:character/deref <- reload in:address:array:character + # if recipe editor has errors, stop + reply-if recipe-warnings:address:address:array:character/deref # check contents of right editor (sandbox) { sandbox-contents:address:array:character <- editor-contents current-sandbox:address:editor-data @@ -2853,6 +2792,111 @@ container sandbox-data [ } ] +recipe render-sandbox-side [ + local-scope + screen:address <- next-ingredient + env:address:programming-environment-data <- next-ingredient + clear:boolean <- next-ingredient + current-sandbox:address:editor-data <- get env:address:programming-environment-data/deref, current-sandbox:offset + left:number <- get current-sandbox:address:editor-data/deref, left:offset + right:number <- get current-sandbox:address:editor-data/deref, right:offset + row:number, screen:address <- render screen:address, current-sandbox:address:editor-data + row:number <- add row:number, 1:literal + draw-horizontal screen:address, row:number, left:number, right:number, 9473:literal/horizontal-double + sandbox:address:sandbox-data <- get env:address:programming-environment-data/deref, sandbox:offset + row:number, screen:address <- render-sandboxes screen:address, sandbox:address:sandbox-data, left:number, right:number, row:number + # clear next line, in case we just processed a backspace + row:number <- add row:number, 1:literal + move-cursor screen:address, row:number, left:number + clear-line-delimited screen:address, left:number, right:number + reply-unless clear:boolean, screen:address/same-as-ingredient:0 + screen-height:number <- screen-height screen:address + { + at-bottom-of-screen?:boolean <- greater-or-equal row:number, screen-height:number + break-if at-bottom-of-screen?:boolean + move-cursor screen:address, row:number, left:number + clear-line-delimited screen:address, left:number, right:number + row:number <- add row:number, 1:literal + loop + } + reply screen:address/same-as-ingredient:0 +] + +recipe render-sandboxes [ + local-scope + screen:address <- next-ingredient + sandbox:address:sandbox-data <- next-ingredient + left:number <- next-ingredient + right:number <- next-ingredient + row:number <- next-ingredient + reply-unless sandbox:address:sandbox-data, row:number/same-as-ingredient:4, screen:address/same-as-ingredient:0 + screen-height:number <- screen-height screen:address + at-bottom?:boolean <- greater-or-equal row:number screen-height:number + reply-if at-bottom?:boolean, row:number/same-as-ingredient:4, screen:address/same-as-ingredient:0 +#? $print [rendering sandbox ], sandbox:address:sandbox-data, 10:literal/newline + # render sandbox menu + row:number <- add row:number, 1:literal + move-cursor screen:address, row:number, left:number + clear-line-delimited screen:address, left:number, right:number + print-character screen:address, 120:literal/x, 245:literal/grey + # save menu row so we can detect clicks to it later + starting-row:address:number <- get-address sandbox:address:sandbox-data/deref, starting-row-on-screen:offset + starting-row:address:number/deref <- copy row:number + # render sandbox contents + sandbox-data:address:array:character <- get sandbox:address:sandbox-data/deref, data:offset + row:number, screen:address <- render-string screen:address, sandbox-data:address:array:character, left:number, right:number, 7:literal/white, row:number + # render sandbox warnings, screen or response, in that order + sandbox-response:address:array:character <- get sandbox:address:sandbox-data/deref, response:offset + sandbox-warnings:address:array:character <- get sandbox:address:sandbox-data/deref, warnings:offset + sandbox-screen:address <- get sandbox:address:sandbox-data/deref, screen:offset + { + break-unless sandbox-warnings:address:array:character + row:number, screen:address <- render-string screen:address, sandbox-warnings:address:array:character, left:number, right:number, 1:literal/red, row:number + } + { + break-if sandbox-warnings:address:array:character + empty-screen?:boolean <- fake-screen-is-clear? sandbox-screen:address + break-if empty-screen?:boolean + row:number, screen:address <- render-screen screen:address, sandbox-screen:address, left:number, right:number, row:number + } + { + break-if sandbox-warnings:address:array:character + break-unless empty-screen?:boolean + row:number, screen:address <- render-string screen:address, sandbox-response:address:array:character, left:number, right:number, 245:literal/grey, row:number + } + at-bottom?:boolean <- greater-or-equal row:number screen-height:number + reply-if at-bottom?:boolean, row:number/same-as-ingredient:4, screen:address/same-as-ingredient:0 + # draw solid line after sandbox + draw-horizontal screen:address, row:number, left:number, right:number, 9473:literal/horizontal-double + # draw next sandbox + next-sandbox:address:sandbox-data <- get sandbox:address:sandbox-data/deref, next-sandbox:offset + row:number, screen:address <- render-sandboxes screen:address, next-sandbox:address:sandbox-data, left:number, right:number, row:number + reply row:number/same-as-ingredient:4, screen:address/same-as-ingredient:0 +] + +# assumes programming environment has no sandboxes; restores them from previous session +recipe restore-sandboxes [ + local-scope + env:address:programming-environment-data <- next-ingredient + # read all scenarios, pushing them to end of a list of scenarios + filename:number <- copy 0:literal + curr:address:address:sandbox-data <- get-address env:address:programming-environment-data/deref, sandbox:offset + { + contents:address:array:character <- restore filename:number + break-unless contents:address:array:character # stop at first error; assuming file didn't exist +#? $print contents:address:array:character, 10:literal/newline + # create new sandbox for file + curr:address:address:sandbox-data/deref <- new sandbox-data:type + data:address:address:array:character <- get-address curr:address:address:sandbox-data/deref/deref, data:offset + data:address:address:array:character/deref <- copy contents:address:array:character + # increment loop variables + filename:number <- add filename:number, 1:literal + curr:address:address:sandbox-data <- get-address curr:address:address:sandbox-data/deref/deref, next-sandbox:offset + loop + } + reply env:address:programming-environment-data/same-as-ingredient:0 +] + # was-deleted?:boolean <- delete-sandbox t:touch-event, env:address:programming-environment-data recipe delete-sandbox [ local-scope @@ -3174,6 +3218,133 @@ container sandbox-data [ ] ] +## handling malformed programs + +scenario run-shows-warnings-in-get [ + $close-trace + assume-screen 100:literal/width, 15:literal/height + assume-console [ + press 65526 # F10 + ] + run [ + x:address:array:character <- new [ +recipe foo [ + get 123:number, foo:offset +]] + y:address:array:character <- new [foo] + env:address:programming-environment-data <- new-programming-environment screen:address, x:address:array:character, y:address:array:character + event-loop screen:address, console:address, env:address:programming-environment-data + ] + screen-should-contain [ + . run (F10) . + . ┊foo . + .recipe foo [ ┊━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━. + . get 123:number, foo:offset ┊ . + .] ┊ . + .unknown element foo in container number ┊ . + .┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┊ . + . ┊ . + ] + screen-should-contain-in-color 1:literal/red, [ + . . + . . + . . + . . + . . + .unknown element foo in container number . + . . + ] +] + +scenario run-shows-missing-type-warnings [ + $close-trace + assume-screen 100:literal/width, 15:literal/height + assume-console [ + press 65526 # F10 + ] + run [ + x:address:array:character <- new [ +recipe foo [ + x:number <- copy 0 + copy x +]] + y:address:array:character <- new [foo] + env:address:programming-environment-data <- new-programming-environment screen:address, x:address:array:character, y:address:array:character + event-loop screen:address, console:address, env:address:programming-environment-data + ] + screen-should-contain [ + . run (F10) . + . ┊foo . + .recipe foo [ ┊━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━. + . x:number <- copy 0 ┊ . + . copy x ┊ . + .] ┊ . + .missing type in 'copy x' ┊ . + .┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┊ . + . ┊ . + ] +] + +scenario run-shows-get-on-non-container-warnings [ + $close-trace + assume-screen 100:literal/width, 15:literal/height + assume-console [ + press 65526 # F10 + ] + run [ + x:address:array:character <- new [ +recipe foo [ + x:address:point <- new point:type + get x:address:point, 1:offset +]] + y:address:array:character <- new [foo] + env:address:programming-environment-data <- new-programming-environment screen:address, x:address:array:character, y:address:array:character + event-loop screen:address, console:address, env:address:programming-environment-data + ] + screen-should-contain [ + . run (F10) . + . ┊ . + .recipe foo [ ┊━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━. + . x:address:point <- new point:type ┊ x. + . get x:address:point, 1:offset ┊foo . + .] ┊foo: 'get' on a non-container x:address:point . + .┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┊━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━. + . ┊ . + ] +] + +scenario run-shows-non-literal-get-argument-warnings [ + $close-trace + assume-screen 100:literal/width, 15:literal/height + assume-console [ + press 65526 # F10 + ] + run [ + x:address:array:character <- new [ +recipe foo [ + x:number <- copy 0 + y:address:point <- new point:type + get y:address:point/deref, x:number +]] + y:address:array:character <- new [foo] + env:address:programming-environment-data <- new-programming-environment screen:address, x:address:array:character, y:address:array:character + event-loop screen:address, console:address, env:address:programming-environment-data + ] + screen-should-contain [ + . run (F10) . + . ┊foo . + .recipe foo [ ┊━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━. + . x:number <- copy 0 ┊ . + . y:address:point <- new point:type ┊ . + . get y:address:point/deref, x:number ┊ . + .] ┊ . + .foo: expected ingredient 1 of 'get' to have type ↩┊ . + .'offset'; got x:number ┊ . + .┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┊ . + . ┊ . + ] +] + ## helpers for drawing editor borders recipe draw-box [ -- cgit 1.4.1-2-gfad0