about summary refs log tree commit diff stats
path: root/edit.mu
diff options
context:
space:
mode:
Diffstat (limited to 'edit.mu')
-rw-r--r--edit.mu652
1 files changed, 326 insertions, 326 deletions
diff --git a/edit.mu b/edit.mu
index a599fcea..a1e6408a 100644
--- a/edit.mu
+++ b/edit.mu
@@ -41,13 +41,13 @@ recipe new-programming-environment [
   divider:number, _ <- divide-with-remainder width:number, 2
   draw-vertical screen:address, divider:number, 1/top, height:number, 9482/vertical-dotted
   # recipe editor on the left
-  recipes:address:address:editor-data <- get-address result:address:programming-environment-data/deref, recipes:offset
-  recipes:address:address:editor-data/deref <- new-editor initial-recipe-contents:address:array:character, screen:address, 0/left, divider:number/right
+  recipes:address:address:editor-data <- get-address result:address:programming-environment-data/lookup, recipes:offset
+  recipes:address:address:editor-data/lookup <- new-editor initial-recipe-contents:address:array:character, screen:address, 0/left, divider:number/right
   # sandbox editor on the right
   new-left:number <- add divider:number, 1
   new-right:number <- add new-left:number, 5
-  current-sandbox:address:address:editor-data <- get-address result:address:programming-environment-data/deref, current-sandbox:offset
-  current-sandbox:address:address:editor-data/deref <- new-editor initial-sandbox-contents:address:array:character, screen:address, new-left:number, width:number
+  current-sandbox:address:address:editor-data <- get-address result:address:programming-environment-data/lookup, current-sandbox:offset
+  current-sandbox:address:address:editor-data/lookup <- new-editor initial-sandbox-contents:address:array:character, screen:address, new-left:number, width:number
   screen:address <- render-all screen:address, result:address:programming-environment-data
   reply result:address:programming-environment-data
 ]
@@ -97,30 +97,30 @@ recipe new-editor [
   right:number <- subtract right:number, 1
   result:address:editor-data <- new editor-data:type
   # initialize screen-related fields
-  x:address:number <- get-address result:address:editor-data/deref, left:offset
-  x:address:number/deref <- copy left:number
-  x:address:number <- get-address result:address:editor-data/deref, right:offset
-  x:address:number/deref <- copy right:number
+  x:address:number <- get-address result:address:editor-data/lookup, left:offset
+  x:address:number/lookup <- copy left:number
+  x:address:number <- get-address result:address:editor-data/lookup, right:offset
+  x:address:number/lookup <- copy right:number
   # initialize cursor
-  x:address:number <- get-address result:address:editor-data/deref, cursor-row:offset
-  x:address:number/deref <- copy 1/top
-  x:address:number <- get-address result:address:editor-data/deref, cursor-column:offset
-  x:address:number/deref <- copy left:number
-  init:address:address:duplex-list <- get-address result:address:editor-data/deref, data:offset
-  init:address:address:duplex-list/deref <- push-duplex 167/§, 0/tail
-  y:address:address:duplex-list <- get-address result:address:editor-data/deref, before-cursor:offset
-  y:address:address:duplex-list/deref <- copy init:address:address:duplex-list/deref
+  x:address:number <- get-address result:address:editor-data/lookup, cursor-row:offset
+  x:address:number/lookup <- copy 1/top
+  x:address:number <- get-address result:address:editor-data/lookup, cursor-column:offset
+  x:address:number/lookup <- copy left:number
+  init:address:address:duplex-list <- get-address result:address:editor-data/lookup, data:offset
+  init:address:address:duplex-list/lookup <- push-duplex 167/§, 0/tail
+  y:address:address:duplex-list <- get-address result:address:editor-data/lookup, before-cursor:offset
+  y:address:address:duplex-list/lookup <- copy init:address:address:duplex-list/lookup
   # early exit if s is empty
   reply-unless s:address:array:character, result:address:editor-data
-  len:number <- length s:address:array:character/deref
+  len:number <- length s:address:array:character/lookup
   reply-unless len:number, result:address:editor-data
   idx:number <- copy 0
   # now we can start appending the rest, character by character
-  curr:address:duplex-list <- copy init:address:address:duplex-list/deref
+  curr:address:duplex-list <- copy init:address:address:duplex-list/lookup
   {
     done?:boolean <- greater-or-equal idx:number, len:number
     break-if done?:boolean
-    c:character <- index s:address:array:character/deref, idx:number
+    c:character <- index s:address:array:character/lookup, idx:number
     insert-duplex c:character, curr:address:duplex-list
     # next iter
     curr:address:duplex-list <- next-duplex curr:address:duplex-list
@@ -128,8 +128,8 @@ recipe new-editor [
     loop
   }
   # initialize cursor to top of screen
-  y:address:address:duplex-list <- get-address result:address:editor-data/deref, before-cursor:offset
-  y:address:address:duplex-list/deref <- copy init:address:address:duplex-list/deref
+  y:address:address:duplex-list <- get-address result:address:editor-data/lookup, before-cursor:offset
+  y:address:address:duplex-list/lookup <- copy init:address:address:duplex-list/lookup
   # initial render to screen, just for some old tests
   _, screen:address <- render screen:address, result:address:editor-data
   reply result:address:editor-data
@@ -139,7 +139,7 @@ scenario editor-initializes-without-data [
   assume-screen 5/width, 3/height
   run [
     1:address:editor-data <- new-editor 0/data, screen:address, 2/left, 5/right
-    2:editor-data <- copy 1:address:editor-data/deref
+    2:editor-data <- copy 1:address:editor-data/lookup
   ]
   memory-should-contain [
     # 2 (data) <- just the § sentinel
@@ -162,23 +162,23 @@ recipe render [
   screen:address <- next-ingredient
   editor:address:editor-data <- next-ingredient
   reply-unless editor:address:editor-data, 1/top, screen:address/same-as-ingredient:0
-  left:number <- get editor:address:editor-data/deref, left:offset
+  left:number <- get editor:address:editor-data/lookup, left:offset
   screen-height:number <- screen-height screen:address
-  right:number <- get editor:address:editor-data/deref, right:offset
+  right:number <- get editor:address:editor-data/lookup, right:offset
   hide-screen screen:address
   # highlight mu code with color
   color:number <- copy 7/white
   highlighting-state:number <- copy 0/normal
   # traversing editor
-  curr:address:duplex-list <- get editor:address:editor-data/deref, data:offset
+  curr:address:duplex-list <- get editor:address:editor-data/lookup, data:offset
   prev:address:duplex-list <- copy curr:address:duplex-list
   curr:address:duplex-list <- next-duplex curr:address:duplex-list
   # traversing screen
   row:number <- copy 1/top
   column:number <- copy left:number
-  cursor-row:address:number <- get-address editor:address:editor-data/deref, cursor-row:offset
-  cursor-column:address:number <- get-address editor:address:editor-data/deref, cursor-column:offset
-  before-cursor:address:address:duplex-list <- get-address editor:address:editor-data/deref, before-cursor:offset
+  cursor-row:address:number <- get-address editor:address:editor-data/lookup, cursor-row:offset
+  cursor-column:address:number <- get-address editor:address:editor-data/lookup, cursor-column:offset
+  before-cursor:address:address:duplex-list <- get-address editor:address:editor-data/lookup, before-cursor:offset
   move-cursor screen:address, row:number, column:number
   {
     +next-character
@@ -189,13 +189,13 @@ recipe render [
     # Doing so at the start of each iteration ensures it stays one step behind
     # the current character.
     {
-      at-cursor-row?:boolean <- equal row:number, cursor-row:address:number/deref
+      at-cursor-row?:boolean <- equal row:number, cursor-row:address:number/lookup
       break-unless at-cursor-row?:boolean
-      at-cursor?:boolean <- equal column:number, cursor-column:address:number/deref
+      at-cursor?:boolean <- equal column:number, cursor-column:address:number/lookup
       break-unless at-cursor?:boolean
-      before-cursor:address:address:duplex-list/deref <- prev-duplex curr:address:duplex-list
+      before-cursor:address:address:duplex-list/lookup <- prev-duplex curr:address:duplex-list
     }
-    c:character <- get curr:address:duplex-list/deref, value:offset
+    c:character <- get curr:address:duplex-list/lookup, value:offset
     color:number, highlighting-state:number <- get-color color:number, highlighting-state:number, c:character
     {
       # newline? move to left rather than 0
@@ -203,12 +203,12 @@ recipe render [
       break-unless newline?:boolean
       # adjust cursor if necessary
       {
-        at-cursor-row?:boolean <- equal row:number, cursor-row:address:number/deref
+        at-cursor-row?:boolean <- equal row:number, cursor-row:address:number/lookup
         break-unless at-cursor-row?:boolean
-        left-of-cursor?:boolean <- lesser-than column:number, cursor-column:address:number/deref
+        left-of-cursor?:boolean <- lesser-than column:number, cursor-column:address:number/lookup
         break-unless left-of-cursor?:boolean
-        cursor-column:address:number/deref <- copy column:number
-        before-cursor:address:address:duplex-list/deref <- prev-duplex curr:address:duplex-list
+        cursor-column:address:number/lookup <- copy column:number
+        before-cursor:address:address:duplex-list/lookup <- prev-duplex curr:address:duplex-list
       }
       # clear rest of line in this window
       clear-line-delimited screen:address, column:number, right:number
@@ -241,24 +241,24 @@ recipe render [
   }
   # is cursor to the right of the last line? move to end
   {
-    at-cursor-row?:boolean <- equal row:number, cursor-row:address:number/deref
-    cursor-outside-line?:boolean <- lesser-or-equal column:number, cursor-column:address:number/deref
+    at-cursor-row?:boolean <- equal row:number, cursor-row:address:number/lookup
+    cursor-outside-line?:boolean <- lesser-or-equal column:number, cursor-column:address:number/lookup
     before-cursor-on-same-line?:boolean <- and at-cursor-row?:boolean, cursor-outside-line?:boolean
-    above-cursor-row?:boolean <- lesser-than row:number, cursor-row:address:number/deref
+    above-cursor-row?:boolean <- lesser-than row:number, cursor-row:address:number/lookup
     before-cursor?:boolean <- or before-cursor-on-same-line?:boolean, above-cursor-row?:boolean
     break-unless before-cursor?:boolean
-    cursor-row:address:number/deref <- copy row:number
-    cursor-column:address:number/deref <- copy column:number
+    cursor-row:address:number/lookup <- copy row:number
+    cursor-column:address:number/lookup <- copy column:number
     # line not wrapped but cursor outside bounds? wrap cursor
     {
-      too-far-right?:boolean <- greater-than cursor-column:address:number/deref, right:number
+      too-far-right?:boolean <- greater-than cursor-column:address:number/lookup, right:number
       break-unless too-far-right?:boolean
-      cursor-column:address:number/deref <- copy left:number
-      cursor-row:address:number/deref <- add cursor-row:address:number/deref, 1
-      above-screen-bottom?:boolean <- lesser-than cursor-row:address:number/deref, screen-height:number
+      cursor-column:address:number/lookup <- copy left:number
+      cursor-row:address:number/lookup <- add cursor-row:address:number/lookup, 1
+      above-screen-bottom?:boolean <- lesser-than cursor-row:address:number/lookup, screen-height:number
       assert above-screen-bottom?:boolean, [unimplemented: wrapping cursor past bottom of screen]
     }
-    before-cursor:address:address:duplex-list/deref <- copy prev:address:duplex-list
+    before-cursor:address:address:duplex-list/lookup <- copy prev:address:duplex-list
   }
   # clear rest of current line
   clear-line-delimited screen:address, column:number, right:number
@@ -283,14 +283,14 @@ recipe render-string [
   move-cursor screen:address, row:number, column:number
   screen-height:number <- screen-height screen:address
   i:number <- copy 0
-  len:number <- length s:address:array:character/deref
+  len:number <- length s:address:array:character/lookup
   {
     +next-character
     done?:boolean <- greater-or-equal i:number, len:number
     break-if done?:boolean
     done?:boolean <- greater-or-equal row:number, screen-height:number
     break-if done?:boolean
-    c:character <- index s:address:array:character/deref, i:number
+    c:character <- index s:address:array:character/lookup, i:number
     {
       # at right? wrap.
       at-right?:boolean <- equal column:number, right:number
@@ -358,11 +358,11 @@ recipe render-screen [
   column:number <- copy left:number
   s-width:number <- screen-width s:address:screen
   s-height:number <- screen-height s:address:screen
-  buf:address:array:screen-cell <- get s:address:screen/deref, data:offset
+  buf:address:array:screen-cell <- get s:address:screen/lookup, data:offset
   stop-printing:number <- add left:number, s-width:number, 3
   max-column:number <- min stop-printing:number, right:number
   i:number <- copy 0
-  len:number <- length buf:address:array:screen-cell/deref
+  len:number <- length buf:address:array:screen-cell/lookup
   screen-height:number <- screen-height screen:address
   {
     done?:boolean <- greater-or-equal i:number, len:number
@@ -380,7 +380,7 @@ recipe render-screen [
       # print row
       row-done?:boolean <- greater-or-equal column:number, max-column:number
       break-if row-done?:boolean
-      curr:screen-cell <- index buf:address:array:screen-cell/deref, i:number
+      curr:screen-cell <- index buf:address:array:screen-cell/lookup, i:number
       c:character <- get curr:screen-cell, contents:offset
       print-character screen:address, c:character, 245/grey
       column:number <- add column:number, 1
@@ -509,8 +509,8 @@ scenario editor-initializes-empty-text [
   run [
     1:address:array:character <- new []
     2:address:editor-data <- new-editor 1:address:array:character, screen:address, 0/left, 5/right
-    3:number <- get 2:address:editor-data/deref, cursor-row:offset
-    4:number <- get 2:address:editor-data/deref, cursor-column:offset
+    3:number <- get 2:address:editor-data/lookup, cursor-row:offset
+    4:number <- get 2:address:editor-data/lookup, cursor-column:offset
   ]
   screen-should-contain [
     .     .
@@ -636,9 +636,9 @@ recipe event-loop [
   screen:address <- next-ingredient
   console:address <- next-ingredient
   env:address:programming-environment-data <- next-ingredient
-  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?:address:boolean <- get-address env:address:programming-environment-data/deref, sandbox-in-focus?:offset
+  recipes:address:editor-data <- get env:address:programming-environment-data/lookup, recipes:offset
+  current-sandbox:address:editor-data <- get env:address:programming-environment-data/lookup, current-sandbox:offset
+  sandbox-in-focus?:address:boolean <- get-address env:address:programming-environment-data/lookup, sandbox-in-focus?:offset
   {
     # looping over each (keyboard or touch) event as it occurs
     +next-event
@@ -652,12 +652,12 @@ recipe event-loop [
       break-unless k:address:number
       # F4? load all code and run all sandboxes.
       {
-        do-run?:boolean <- equal k:address:number/deref, 65532/F4
+        do-run?:boolean <- equal k:address:number/lookup, 65532/F4
         break-unless do-run?:boolean
         run-sandboxes env:address:programming-environment-data
         # F4 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
+        update-cursor screen:address, recipes:address:editor-data, current-sandbox:address:editor-data, sandbox-in-focus?:address:boolean/lookup
         show-screen screen:address
         loop +next-event:label
       }
@@ -667,10 +667,10 @@ recipe event-loop [
       break-unless c:address:character
       # ctrl-n? - switch focus
       {
-        ctrl-n?:boolean <- equal c:address:character/deref, 14/ctrl-n
+        ctrl-n?:boolean <- equal c:address:character/lookup, 14/ctrl-n
         break-unless ctrl-n?:boolean
-        sandbox-in-focus?:address:boolean/deref <- not sandbox-in-focus?:address:boolean/deref
-        update-cursor screen:address, recipes:address:editor-data, current-sandbox:address:editor-data, sandbox-in-focus?:address:boolean/deref
+        sandbox-in-focus?:address:boolean/lookup <- not sandbox-in-focus?:address:boolean/lookup
+        update-cursor screen:address, recipes:address:editor-data, current-sandbox:address:editor-data, sandbox-in-focus?:address:boolean/lookup
         show-screen screen:address
         loop +next-event:label
       }
@@ -681,32 +681,32 @@ recipe event-loop [
       break-unless t:address:touch-event
       # ignore all but 'left-click' events for now
       # todo: test this
-      touch-type:number <- get t:address:touch-event/deref, type:offset
+      touch-type:number <- get t:address:touch-event/lookup, type:offset
       is-left-click?:boolean <- equal touch-type:number, 65513/mouse-left
       loop-unless is-left-click?:boolean, +next-event:label
       # on a sandbox delete icon? process delete
       {
-        was-delete?:boolean <- delete-sandbox t:address:touch-event/deref, env:address:programming-environment-data
+        was-delete?:boolean <- delete-sandbox t:address:touch-event/lookup, env:address:programming-environment-data
         break-unless was-delete?:boolean
 #?         trace [app], [delete clicked] #? 1
         screen:address <- render-sandbox-side screen:address, env:address:programming-environment-data, 1/clear
-        update-cursor screen:address, recipes:address:editor-data, current-sandbox:address:editor-data, sandbox-in-focus?:address:boolean/deref
+        update-cursor screen:address, recipes:address:editor-data, current-sandbox:address:editor-data, sandbox-in-focus?:address:boolean/lookup
         show-screen screen:address
         loop +next-event:label
       }
       # if not, send to both editors
-      _ <- move-cursor-in-editor screen:address, recipes:address:editor-data, t:address:touch-event/deref
-      sandbox-in-focus?:address:boolean/deref <- move-cursor-in-editor screen:address, current-sandbox:address:editor-data, t:address:touch-event/deref
+      _ <- move-cursor-in-editor screen:address, recipes:address:editor-data, t:address:touch-event/lookup
+      sandbox-in-focus?:address:boolean/lookup <- move-cursor-in-editor screen:address, current-sandbox:address:editor-data, t:address:touch-event/lookup
       jump +continue:label
     }
     # if it's not global, send to appropriate editor
     {
       {
-        break-if sandbox-in-focus?:address:boolean/deref
+        break-if sandbox-in-focus?:address:boolean/lookup
         handle-event screen:address, console:address, recipes:address:editor-data, e:event
       }
       {
-        break-unless sandbox-in-focus?:address:boolean/deref
+        break-unless sandbox-in-focus?:address:boolean/lookup
         handle-event screen:address, console:address, current-sandbox:address:editor-data, e:event
       }
     }
@@ -741,7 +741,7 @@ recipe editor-event-loop [
     {
       t:address:touch-event <- maybe-convert e:event, touch:variant
       break-unless t:address:touch-event
-      move-cursor-in-editor screen:address, editor:address:editor-data, t:address:touch-event/deref
+      move-cursor-in-editor screen:address, editor:address:editor-data, t:address:touch-event/lookup
       jump +continue:label
     }
     # other events - send to appropriate editor
@@ -749,8 +749,8 @@ recipe editor-event-loop [
     +continue
     row:number, screen:address <- render screen:address, editor:address:editor-data
     # clear next line, in case we just processed a backspace
-    left:number <- get editor:address:editor-data/deref, left:offset
-    right:number <- get editor:address:editor-data/deref, right:offset
+    left:number <- get editor:address:editor-data/lookup, left:offset
+    right:number <- get editor:address:editor-data/lookup, right:offset
     row:number <- add row:number, 1
     move-cursor screen:address, row:number, left:number
     clear-line-delimited screen:address, left:number, right:number
@@ -772,81 +772,81 @@ recipe handle-event [
     ## check for special characters
     # backspace - delete character before cursor
     {
-      backspace?:boolean <- equal c:address:character/deref, 8/backspace
+      backspace?:boolean <- equal c:address:character/lookup, 8/backspace
       break-unless backspace?:boolean
       delete-before-cursor editor:address:editor-data
       reply
     }
     # ctrl-a - move cursor to start of line
     {
-      ctrl-a?:boolean <- equal c:address:character/deref, 1/ctrl-a
+      ctrl-a?:boolean <- equal c:address:character/lookup, 1/ctrl-a
       break-unless ctrl-a?:boolean
       move-to-start-of-line editor:address:editor-data
       reply
     }
     # ctrl-e - move cursor to end of line
     {
-      ctrl-e?:boolean <- equal c:address:character/deref, 5/ctrl-e
+      ctrl-e?:boolean <- equal c:address:character/lookup, 5/ctrl-e
       break-unless ctrl-e?:boolean
       move-to-end-of-line editor:address:editor-data
       reply
     }
     # ctrl-u - delete until start of line (excluding cursor)
     {
-      ctrl-u?:boolean <- equal c:address:character/deref, 21/ctrl-u
+      ctrl-u?:boolean <- equal c:address:character/lookup, 21/ctrl-u
       break-unless ctrl-u?:boolean
       delete-to-start-of-line editor:address:editor-data
       reply
     }
     # ctrl-k - delete until end of line (including cursor)
     {
-      ctrl-k?:boolean <- equal c:address:character/deref, 11/ctrl-k
+      ctrl-k?:boolean <- equal c:address:character/lookup, 11/ctrl-k
       break-unless ctrl-k?:boolean
       delete-to-end-of-line editor:address:editor-data
       reply
     }
     # tab - insert two spaces
     {
-      tab?:boolean <- equal c:address:character/deref, 9/tab
+      tab?:boolean <- equal c:address:character/lookup, 9/tab
       break-unless tab?:boolean
       insert-at-cursor editor:address:editor-data, 32/space, screen:address
       insert-at-cursor editor:address:editor-data, 32/space, screen:address
       reply
     }
     # otherwise type it in
-    insert-at-cursor editor:address:editor-data, c:address:character/deref, screen:address
+    insert-at-cursor editor:address:editor-data, c:address:character/lookup, screen:address
     reply
   }
   # otherwise it's a special key
   k:address:number <- maybe-convert e:event, keycode:variant
   assert k:address:number, [event was of unknown type; neither keyboard nor mouse]
-  d:address:duplex-list <- get editor:address:editor-data/deref, data:offset
-  before-cursor:address:address:duplex-list <- get-address editor:address:editor-data/deref, before-cursor:offset
-  cursor-row:address:number <- get-address editor:address:editor-data/deref, cursor-row:offset
-  cursor-column:address:number <- get-address editor:address:editor-data/deref, cursor-column:offset
+  d:address:duplex-list <- get editor:address:editor-data/lookup, data:offset
+  before-cursor:address:address:duplex-list <- get-address editor:address:editor-data/lookup, before-cursor:offset
+  cursor-row:address:number <- get-address editor:address:editor-data/lookup, cursor-row:offset
+  cursor-column:address:number <- get-address editor:address:editor-data/lookup, cursor-column:offset
   screen-height:number <- screen-height screen:address
-  left:number <- get editor:address:editor-data/deref, left:offset
-  right:number <- get editor:address:editor-data/deref, right:offset
+  left:number <- get editor:address:editor-data/lookup, left:offset
+  right:number <- get editor:address:editor-data/lookup, right:offset
   # arrows; update cursor-row and cursor-column, leave before-cursor to 'render'.
   # right arrow
   {
-    move-to-next-character?:boolean <- equal k:address:number/deref, 65514/right-arrow
+    move-to-next-character?:boolean <- equal k:address:number/lookup, 65514/right-arrow
     break-unless move-to-next-character?:boolean
     # if not at end of text
-    old-cursor:address:duplex-list <- next-duplex before-cursor:address:address:duplex-list/deref
+    old-cursor:address:duplex-list <- next-duplex before-cursor:address:address:duplex-list/lookup
     break-unless old-cursor:address:duplex-list
     # scan to next character
-    before-cursor:address:address:duplex-list/deref <- copy old-cursor:address:duplex-list
+    before-cursor:address:address:duplex-list/lookup <- copy old-cursor:address:duplex-list
     # if crossed a newline, move cursor to start of next row
     {
-      old-cursor-character:character <- get before-cursor:address:address:duplex-list/deref/deref, value:offset
+      old-cursor-character:character <- get before-cursor:address:address:duplex-list/lookup/lookup, value:offset
       was-at-newline?:boolean <- equal old-cursor-character:character, 10/newline
       break-unless was-at-newline?:boolean
-      cursor-row:address:number/deref <- add cursor-row:address:number/deref, 1
-      cursor-column:address:number/deref <- copy left:number
+      cursor-row:address:number/lookup <- add cursor-row:address:number/lookup, 1
+      cursor-column:address:number/lookup <- copy left:number
       # todo: what happens when cursor is too far down?
       screen-height:number <- screen-height screen:address
-      above-screen-bottom?:boolean <- lesser-than cursor-row:address:number/deref, screen-height:number
+      above-screen-bottom?:boolean <- lesser-than cursor-row:address:number/lookup, screen-height:number
       assert above-screen-bottom?:boolean, [unimplemented: moving past bottom of screen]
       reply
     }
@@ -854,93 +854,93 @@ recipe handle-event [
     {
       # if we're at the column just before the wrap indicator
       wrap-column:number <- subtract right:number, 1
-      at-wrap?:boolean <- equal cursor-column:address:number/deref, wrap-column:number
+      at-wrap?:boolean <- equal cursor-column:address:number/lookup, wrap-column:number
       break-unless at-wrap?:boolean
       # and if next character isn't newline
       new-cursor:address:duplex-list <- next-duplex old-cursor:address:duplex-list
       break-unless new-cursor:address:duplex-list
-      next-character:character <- get new-cursor:address:duplex-list/deref, value:offset
+      next-character:character <- get new-cursor:address:duplex-list/lookup, value:offset
       newline?:boolean <- equal next-character:character, 10/newline
       break-if newline?:boolean
-      cursor-row:address:number/deref <- add cursor-row:address:number/deref, 1
-      cursor-column:address:number/deref <- copy left:number
+      cursor-row:address:number/lookup <- add cursor-row:address:number/lookup, 1
+      cursor-column:address:number/lookup <- copy left:number
       # todo: what happens when cursor is too far down?
-      above-screen-bottom?:boolean <- lesser-than cursor-row:address:number/deref, screen-height:number
+      above-screen-bottom?:boolean <- lesser-than cursor-row:address:number/lookup, screen-height:number
       assert above-screen-bottom?:boolean, [unimplemented: moving past bottom of screen]
       reply
     }
     # otherwise move cursor one character right
-    cursor-column:address:number/deref <- add cursor-column:address:number/deref, 1
+    cursor-column:address:number/lookup <- add cursor-column:address:number/lookup, 1
   }
   # left arrow
   {
-    move-to-previous-character?:boolean <- equal k:address:number/deref, 65515/left-arrow
+    move-to-previous-character?:boolean <- equal k:address:number/lookup, 65515/left-arrow
     break-unless move-to-previous-character?:boolean
 #?     trace [app], [left arrow] #? 1
     # if not at start of text (before-cursor at § sentinel)
-    prev:address:duplex-list <- prev-duplex before-cursor:address:address:duplex-list/deref
+    prev:address:duplex-list <- prev-duplex before-cursor:address:address:duplex-list/lookup
     break-unless prev:address:duplex-list
     # if cursor not at left margin, move one character left
     {
-      at-left-margin?:boolean <- equal cursor-column:address:number/deref, 0
+      at-left-margin?:boolean <- equal cursor-column:address:number/lookup, 0
       break-if at-left-margin?:boolean
 #?       trace [app], [decrementing] #? 1
-      cursor-column:address:number/deref <- subtract cursor-column:address:number/deref, 1
+      cursor-column:address:number/lookup <- subtract cursor-column:address:number/lookup, 1
       reply
     }
     # if at left margin, there's guaranteed to be a previous line, since we're
     # not at start of text
     {
       # if before-cursor is at newline, figure out how long the previous line is
-      prevc:character <- get before-cursor:address:address:duplex-list/deref/deref, value:offset
+      prevc:character <- get before-cursor:address:address:duplex-list/lookup/lookup, value:offset
       previous-character-is-newline?:boolean <- equal prevc:character, 10/newline
       break-unless previous-character-is-newline?:boolean
 #?       trace [app], [previous line] #? 1
       # compute length of previous line
-      end-of-line:number <- previous-line-length before-cursor:address:address:duplex-list/deref, d:address:duplex-list
-      cursor-row:address:number/deref <- subtract cursor-row:address:number/deref, 1
-      cursor-column:address:number/deref <- copy end-of-line:number
+      end-of-line:number <- previous-line-length before-cursor:address:address:duplex-list/lookup, d:address:duplex-list
+      cursor-row:address:number/lookup <- subtract cursor-row:address:number/lookup, 1
+      cursor-column:address:number/lookup <- copy end-of-line:number
       reply
     }
     # if before-cursor is not at newline, we're just at a wrapped line
-    assert cursor-row:address:number/deref, [unimplemented: moving cursor above top of screen]
-    cursor-row:address:number/deref <- subtract cursor-row:address:number/deref, 1
-    cursor-column:address:number/deref <- subtract right:number, 1  # leave room for wrap icon
+    assert cursor-row:address:number/lookup, [unimplemented: moving cursor above top of screen]
+    cursor-row:address:number/lookup <- subtract cursor-row:address:number/lookup, 1
+    cursor-column:address:number/lookup <- subtract right:number, 1  # leave room for wrap icon
   }
   # down arrow
   {
-    move-to-next-line?:boolean <- equal k:address:number/deref, 65516/down-arrow
+    move-to-next-line?:boolean <- equal k:address:number/lookup, 65516/down-arrow
     break-unless move-to-next-line?:boolean
     # todo: support scrolling
-    already-at-bottom?:boolean <- greater-or-equal cursor-row:address:number/deref, screen-height:number
+    already-at-bottom?:boolean <- greater-or-equal cursor-row:address:number/lookup, screen-height:number
     break-if already-at-bottom?:boolean
 #?     $print [moving down
 #? ] #? 1
-    cursor-row:address:number/deref <- add cursor-row:address:number/deref, 1
+    cursor-row:address:number/lookup <- add cursor-row:address:number/lookup, 1
     # that's it; render will adjust cursor-column as necessary
   }
   # up arrow
   {
-    move-to-previous-line?:boolean <- equal k:address:number/deref, 65517/up-arrow
+    move-to-previous-line?:boolean <- equal k:address:number/lookup, 65517/up-arrow
     break-unless move-to-previous-line?:boolean
     # todo: support scrolling
-    already-at-top?:boolean <- lesser-or-equal cursor-row:address:number/deref, 1/top
+    already-at-top?:boolean <- lesser-or-equal cursor-row:address:number/lookup, 1/top
     break-if already-at-top?:boolean
 #?     $print [moving up
 #? ] #? 1
-    cursor-row:address:number/deref <- subtract cursor-row:address:number/deref, 1
+    cursor-row:address:number/lookup <- subtract cursor-row:address:number/lookup, 1
     # that's it; render will adjust cursor-column as necessary
   }
   # home
   {
-    home?:boolean <- equal k:address:number/deref, 65521/home
+    home?:boolean <- equal k:address:number/lookup, 65521/home
     break-unless home?:boolean
     move-to-start-of-line editor:address:editor-data
     reply
   }
   # end
   {
-    end?:boolean <- equal k:address:number/deref, 65520/end
+    end?:boolean <- equal k:address:number/lookup, 65520/end
     break-unless end?:boolean
     move-to-end-of-line editor:address:editor-data
     reply
@@ -956,17 +956,17 @@ recipe move-cursor-in-editor [
   t:touch-event <- next-ingredient
   reply-unless editor:address:editor-data, 0/false
   click-column:number <- get t:touch-event, column:offset
-  left:number <- get editor:address:editor-data/deref, left:offset
+  left:number <- get editor:address:editor-data/lookup, left:offset
   too-far-left?:boolean <- lesser-than click-column:number, left:number
   reply-if too-far-left?:boolean, 0/false
-  right:number <- get editor:address:editor-data/deref, right:offset
+  right:number <- get editor:address:editor-data/lookup, right:offset
   too-far-right?:boolean <- greater-than click-column:number, right:number
   reply-if too-far-right?:boolean, 0/false
   # update cursor
-  cursor-row:address:number <- get-address editor:address:editor-data/deref, cursor-row:offset
-  cursor-row:address:number/deref <- get t:touch-event, row:offset
-  cursor-column:address:number <- get-address editor:address:editor-data/deref, cursor-column:offset
-  cursor-column:address:number/deref <- get t:touch-event, column:offset
+  cursor-row:address:number <- get-address editor:address:editor-data/lookup, cursor-row:offset
+  cursor-row:address:number/lookup <- get t:touch-event, row:offset
+  cursor-column:address:number <- get-address editor:address:editor-data/lookup, cursor-column:offset
+  cursor-column:address:number/lookup <- get t:touch-event, column:offset
   # gain focus
   reply 1/true
 ]
@@ -977,24 +977,24 @@ recipe insert-at-cursor [
   c:character <- next-ingredient
   screen:address <- next-ingredient
 #?   $print [insert ], c:character, 10/newline #? 1
-  before-cursor:address:address:duplex-list <- get-address editor:address:editor-data/deref, before-cursor:offset
-  insert-duplex c:character, before-cursor:address:address:duplex-list/deref
-  before-cursor:address:address:duplex-list/deref <- next-duplex before-cursor:address:address:duplex-list/deref
-  cursor-row:address:number <- get-address editor:address:editor-data/deref, cursor-row:offset
-  cursor-column:address:number <- get-address editor:address:editor-data/deref, cursor-column:offset
-  left:number <- get editor:address:editor-data/deref, left:offset
-  right:number <- get editor:address:editor-data/deref, right:offset
+  before-cursor:address:address:duplex-list <- get-address editor:address:editor-data/lookup, before-cursor:offset
+  insert-duplex c:character, before-cursor:address:address:duplex-list/lookup
+  before-cursor:address:address:duplex-list/lookup <- next-duplex before-cursor:address:address:duplex-list/lookup
+  cursor-row:address:number <- get-address editor:address:editor-data/lookup, cursor-row:offset
+  cursor-column:address:number <- get-address editor:address:editor-data/lookup, cursor-column:offset
+  left:number <- get editor:address:editor-data/lookup, left:offset
+  right:number <- get editor:address:editor-data/lookup, right:offset
   # update cursor: if newline, move cursor to start of next line
   # todo: bottom of screen
   {
     newline?:boolean <- equal c:character, 10/newline
     break-unless newline?:boolean
-    cursor-row:address:number/deref <- add cursor-row:address:number/deref, 1
-    cursor-column:address:number/deref <- copy left:number
+    cursor-row:address:number/lookup <- add cursor-row:address:number/lookup, 1
+    cursor-column:address:number/lookup <- copy left:number
     # indent if necessary
 #?     $print [computing indent], 10/newline #? 1
-    d:address:duplex-list <- get editor:address:editor-data/deref, data:offset
-    end-of-previous-line:address:duplex-list <- prev-duplex before-cursor:address:address:duplex-list/deref
+    d:address:duplex-list <- get editor:address:editor-data/lookup, data:offset
+    end-of-previous-line:address:duplex-list <- prev-duplex before-cursor:address:address:duplex-list/lookup
     indent:number <- line-indent end-of-previous-line:address:duplex-list, d:address:duplex-list
 #?     $print indent:number, 10/newline #? 1
     i:number <- copy 0
@@ -1011,41 +1011,41 @@ recipe insert-at-cursor [
   {
     # if we're at the column just before the wrap indicator
     wrap-column:number <- subtract right:number, 1
-#?     $print [wrap? ], cursor-column:address:number/deref, [ vs ], wrap-column:number, 10/newline
-    at-wrap?:boolean <- greater-or-equal cursor-column:address:number/deref, wrap-column:number
+#?     $print [wrap? ], cursor-column:address:number/lookup, [ vs ], wrap-column:number, 10/newline
+    at-wrap?:boolean <- greater-or-equal cursor-column:address:number/lookup, wrap-column:number
     break-unless at-wrap?:boolean
 #?     $print [wrap!
 #? ] #? 1
-    cursor-column:address:number/deref <- subtract cursor-column:address:number/deref, wrap-column:number
-    cursor-row:address:number/deref <- add cursor-row:address:number/deref, 1
+    cursor-column:address:number/lookup <- subtract cursor-column:address:number/lookup, wrap-column:number
+    cursor-row:address:number/lookup <- add cursor-row:address:number/lookup, 1
     # todo: what happens when cursor is too far down?
     screen-height:number <- screen-height screen:address
-    above-screen-bottom?:boolean <- lesser-than cursor-row:address:number/deref, screen-height:number
+    above-screen-bottom?:boolean <- lesser-than cursor-row:address:number/lookup, screen-height:number
     assert above-screen-bottom?:boolean, [unimplemented: typing past bottom of screen]
 #?     $print [return
 #? ] #? 1
     reply
   }
   # otherwise move cursor right
-  cursor-column:address:number/deref <- add cursor-column:address:number/deref, 1
+  cursor-column:address:number/lookup <- add cursor-column:address:number/lookup, 1
 ]
 
 recipe delete-before-cursor [
   local-scope
   editor:address:editor-data <- next-ingredient
-  before-cursor:address:address:duplex-list <- get-address editor:address:editor-data/deref, before-cursor:offset
-  d:address:duplex-list <- get editor:address:editor-data/deref, data:offset
+  before-cursor:address:address:duplex-list <- get-address editor:address:editor-data/lookup, before-cursor:offset
+  d:address:duplex-list <- get editor:address:editor-data/lookup, data:offset
   # unless already at start
-  at-start?:boolean <- equal before-cursor:address:address:duplex-list/deref, d:address:duplex-list
+  at-start?:boolean <- equal before-cursor:address:address:duplex-list/lookup, d:address:duplex-list
   reply-if at-start?:boolean
   # delete character
-  prev:address:duplex-list <- prev-duplex before-cursor:address:address:duplex-list/deref
-  remove-duplex before-cursor:address:address:duplex-list/deref
+  prev:address:duplex-list <- prev-duplex before-cursor:address:address:duplex-list/lookup
+  remove-duplex before-cursor:address:address:duplex-list/lookup
   # update cursor
-  before-cursor:address:address:duplex-list/deref <- copy prev:address:duplex-list
-  cursor-column:address:number <- get-address editor:address:editor-data/deref, cursor-column:offset
-  cursor-column:address:number/deref <- subtract cursor-column:address:number/deref, 1
-#?   $print [delete-before-cursor: ], cursor-column:address:number/deref, 10/newline
+  before-cursor:address:address:duplex-list/lookup <- copy prev:address:duplex-list
+  cursor-column:address:number <- get-address editor:address:editor-data/lookup, cursor-column:offset
+  cursor-column:address:number/lookup <- subtract cursor-column:address:number/lookup, 1
+#?   $print [delete-before-cursor: ], cursor-column:address:number/lookup, 10/newline
 ]
 
 # takes a pointer 'curr' into the doubly-linked list and its sentinel, counts
@@ -1063,7 +1063,7 @@ recipe previous-line-length [
     break-unless curr:address:duplex-list
     at-start?:boolean <- equal curr:address:duplex-list, start:address:duplex-list
     break-if at-start?:boolean
-    c:character <- get curr:address:duplex-list/deref, value:offset
+    c:character <- get curr:address:duplex-list/lookup, value:offset
     at-newline?:boolean <- equal c:character 10/newline
     break-if at-newline?:boolean
     result:number <- add result:number, 1
@@ -1091,7 +1091,7 @@ recipe line-indent [
     at-start?:boolean <- equal curr:address:duplex-list, start:address:duplex-list
     break-if at-start?:boolean
 #?   $print [a3], 10/newline #? 1
-    c:character <- get curr:address:duplex-list/deref, value:offset
+    c:character <- get curr:address:duplex-list/lookup, value:offset
     at-newline?:boolean <- equal c:character, 10/newline
     break-if at-newline?:boolean
 #?   $print [a4], 10/newline #? 1
@@ -1115,21 +1115,21 @@ recipe move-to-start-of-line [
   local-scope
   editor:address:editor-data <- next-ingredient
   # update cursor column
-  left:number <- get editor:address:editor-data/deref, left:offset
-  cursor-column:address:number <- get-address editor:address:editor-data/deref, cursor-column:offset
-  cursor-column:address:number/deref <- copy left:number
+  left:number <- get editor:address:editor-data/lookup, left:offset
+  cursor-column:address:number <- get-address editor:address:editor-data/lookup, cursor-column:offset
+  cursor-column:address:number/lookup <- copy left:number
   # update before-cursor
-  before-cursor:address:address:duplex-list <- get-address editor:address:editor-data/deref, before-cursor:offset
-  init:address:duplex-list <- get editor:address:editor-data/deref, data:offset
+  before-cursor:address:address:duplex-list <- get-address editor:address:editor-data/lookup, before-cursor:offset
+  init:address:duplex-list <- get editor:address:editor-data/lookup, data:offset
   # while not at start of line, move 
   {
-    at-start-of-text?:boolean <- equal before-cursor:address:address:duplex-list/deref, init:address:duplex-list
+    at-start-of-text?:boolean <- equal before-cursor:address:address:duplex-list/lookup, init:address:duplex-list
     break-if at-start-of-text?:boolean
-    prev:character <- get before-cursor:address:address:duplex-list/deref/deref, value:offset
+    prev:character <- get before-cursor:address:address:duplex-list/lookup/lookup, value:offset
     at-start-of-line?:boolean <- equal prev:character, 10/newline
     break-if at-start-of-line?:boolean
-    before-cursor:address:address:duplex-list/deref <- prev-duplex before-cursor:address:address:duplex-list/deref
-    assert before-cursor:address:address:duplex-list/deref, [move-to-start-of-line tried to move before start of text]
+    before-cursor:address:address:duplex-list/lookup <- prev-duplex before-cursor:address:address:duplex-list/lookup
+    assert before-cursor:address:address:duplex-list/lookup, [move-to-start-of-line tried to move before start of text]
     loop
   }
 ]
@@ -1137,35 +1137,35 @@ recipe move-to-start-of-line [
 recipe move-to-end-of-line [
   local-scope
   editor:address:editor-data <- next-ingredient
-  before-cursor:address:address:duplex-list <- get-address editor:address:editor-data/deref, before-cursor:offset
-  cursor-column:address:number <- get-address editor:address:editor-data/deref, cursor-column:offset
+  before-cursor:address:address:duplex-list <- get-address editor:address:editor-data/lookup, before-cursor:offset
+  cursor-column:address:number <- get-address editor:address:editor-data/lookup, cursor-column:offset
   # while not at start of line, move 
   {
-    next:address:duplex-list <- next-duplex before-cursor:address:address:duplex-list/deref
+    next:address:duplex-list <- next-duplex before-cursor:address:address:duplex-list/lookup
     break-unless next:address:duplex-list  # end of text
-    nextc:character <- get next:address:duplex-list/deref, value:offset
+    nextc:character <- get next:address:duplex-list/lookup, value:offset
     at-end-of-line?:boolean <- equal nextc:character, 10/newline
     break-if at-end-of-line?:boolean
-    before-cursor:address:address:duplex-list/deref <- copy next:address:duplex-list
-    cursor-column:address:number/deref <- add cursor-column:address:number/deref, 1
+    before-cursor:address:address:duplex-list/lookup <- copy next:address:duplex-list
+    cursor-column:address:number/lookup <- add cursor-column:address:number/lookup, 1
     loop
   }
   # move one past end of line
-  cursor-column:address:number/deref <- add cursor-column:address:number/deref, 1
+  cursor-column:address:number/lookup <- add cursor-column:address:number/lookup, 1
 ]
 
 recipe delete-to-start-of-line [
   local-scope
   editor:address:editor-data <- next-ingredient
   # compute range to delete
-  init:address:duplex-list <- get editor:address:editor-data/deref, data:offset
-  before-cursor:address:address:duplex-list <- get-address editor:address:editor-data/deref, before-cursor:offset
-  start:address:duplex-list <- copy before-cursor:address:address:duplex-list/deref
-  end:address:duplex-list <- next-duplex before-cursor:address:address:duplex-list/deref
+  init:address:duplex-list <- get editor:address:editor-data/lookup, data:offset
+  before-cursor:address:address:duplex-list <- get-address editor:address:editor-data/lookup, before-cursor:offset
+  start:address:duplex-list <- copy before-cursor:address:address:duplex-list/lookup
+  end:address:duplex-list <- next-duplex before-cursor:address:address:duplex-list/lookup
   {
     at-start-of-text?:boolean <- equal start:address:duplex-list, init:address:duplex-list
     break-if at-start-of-text?:boolean
-    curr:character <- get start:address:duplex-list/deref, value:offset
+    curr:character <- get start:address:duplex-list/lookup, value:offset
     at-start-of-line?:boolean <- equal curr:character, 10/newline
     break-if at-start-of-line?:boolean
     start:address:duplex-list <- prev-duplex start:address:duplex-list
@@ -1173,39 +1173,39 @@ recipe delete-to-start-of-line [
     loop
   }
   # snip it out
-  start-next:address:address:duplex-list <- get-address start:address:duplex-list/deref, next:offset
-  start-next:address:address:duplex-list/deref <- copy end:address:duplex-list
-  end-prev:address:address:duplex-list <- get-address end:address:duplex-list/deref, prev:offset
-  end-prev:address:address:duplex-list/deref <- copy start:address:duplex-list
+  start-next:address:address:duplex-list <- get-address start:address:duplex-list/lookup, next:offset
+  start-next:address:address:duplex-list/lookup <- copy end:address:duplex-list
+  end-prev:address:address:duplex-list <- get-address end:address:duplex-list/lookup, prev:offset
+  end-prev:address:address:duplex-list/lookup <- copy start:address:duplex-list
   # adjust cursor
-  before-cursor:address:address:duplex-list/deref <- prev-duplex end:address:duplex-list
-  left:number <- get editor:address:editor-data/deref, left:offset
-  cursor-column:address:number <- get-address editor:address:editor-data/deref, cursor-column:offset
-  cursor-column:address:number/deref <- copy left:number
+  before-cursor:address:address:duplex-list/lookup <- prev-duplex end:address:duplex-list
+  left:number <- get editor:address:editor-data/lookup, left:offset
+  cursor-column:address:number <- get-address editor:address:editor-data/lookup, cursor-column:offset
+  cursor-column:address:number/lookup <- copy left:number
 ]
 
 recipe delete-to-end-of-line [
   local-scope
   editor:address:editor-data <- next-ingredient
   # compute range to delete
-  start:address:duplex-list <- get editor:address:editor-data/deref, before-cursor:offset
+  start:address:duplex-list <- get editor:address:editor-data/lookup, before-cursor:offset
   end:address:duplex-list <- next-duplex start:address:duplex-list
   {
     at-end-of-text?:boolean <- equal end:address:duplex-list, 0/null
     break-if at-end-of-text?:boolean
-    curr:character <- get end:address:duplex-list/deref, value:offset
+    curr:character <- get end:address:duplex-list/lookup, value:offset
     at-end-of-line?:boolean <- equal curr:character, 10/newline
     break-if at-end-of-line?:boolean
     end:address:duplex-list <- next-duplex end:address:duplex-list
     loop
   }
   # snip it out
-  start-next:address:address:duplex-list <- get-address start:address:duplex-list/deref, next:offset
-  start-next:address:address:duplex-list/deref <- copy end:address:duplex-list
+  start-next:address:address:duplex-list <- get-address start:address:duplex-list/lookup, next:offset
+  start-next:address:address:duplex-list/lookup <- copy end:address:duplex-list
   {
     break-unless end:address:duplex-list
-    end-prev:address:address:duplex-list <- get-address end:address:duplex-list/deref, prev:offset
-    end-prev:address:address:duplex-list/deref <- copy start:address:duplex-list
+    end-prev:address:address:duplex-list <- get-address end:address:duplex-list/lookup, prev:offset
+    end-prev:address:address:duplex-list/lookup <- copy start:address:duplex-list
   }
 ]
 
@@ -1215,9 +1215,9 @@ recipe render-all [
   env:address:programming-environment-data <- next-ingredient
   screen:address <- render-recipes screen:address, env:address:programming-environment-data, 1/clear-below
   screen:address <- render-sandbox-side screen:address, env:address:programming-environment-data, 1/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
+  recipes:address:editor-data <- get env:address:programming-environment-data/lookup, recipes:offset
+  current-sandbox:address:editor-data <- get env:address:programming-environment-data/lookup, current-sandbox:offset
+  sandbox-in-focus?:boolean <- get env:address:programming-environment-data/lookup, sandbox-in-focus?:offset
   update-cursor screen:address, recipes:address:editor-data, current-sandbox:address:editor-data, sandbox-in-focus?:boolean
   show-screen screen:address
   reply screen:address/same-as-ingredient:0
@@ -1227,20 +1227,20 @@ recipe render-minimal [
   local-scope
   screen:address <- next-ingredient
   env:address:programming-environment-data <- next-ingredient
-  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
+  recipes:address:editor-data <- get env:address:programming-environment-data/lookup, recipes:offset
+  current-sandbox:address:editor-data <- get env:address:programming-environment-data/lookup, current-sandbox:offset
+  sandbox-in-focus?:boolean <- get env:address:programming-environment-data/lookup, sandbox-in-focus?:offset
   {
     break-if sandbox-in-focus?:boolean
     screen:address <- render-recipes screen:address, env:address:programming-environment-data
-    cursor-row:number <- get recipes:address:editor-data/deref, cursor-row:offset
-    cursor-column:number <- get recipes:address:editor-data/deref, cursor-column:offset
+    cursor-row:number <- get recipes:address:editor-data/lookup, cursor-row:offset
+    cursor-column:number <- get recipes:address:editor-data/lookup, cursor-column:offset
   }
   {
     break-unless sandbox-in-focus?:boolean
     screen:address <- render-sandbox-side screen:address, env:address:programming-environment-data
-    cursor-row:number <- get current-sandbox:address:editor-data/deref, cursor-row:offset
-    cursor-column:number <- get current-sandbox:address:editor-data/deref, cursor-column:offset
+    cursor-row:number <- get current-sandbox:address:editor-data/lookup, cursor-row:offset
+    cursor-column:number <- get current-sandbox:address:editor-data/lookup, cursor-column:offset
   }
   move-cursor screen:address, cursor-row:number, cursor-column:number
   show-screen screen:address
@@ -1252,12 +1252,12 @@ recipe render-recipes [
   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
+  recipes:address:editor-data <- get env:address:programming-environment-data/lookup, recipes:offset
   # render recipes
-  left:number <- get recipes:address:editor-data/deref, left:offset
-  right:number <- get recipes:address:editor-data/deref, right:offset
+  left:number <- get recipes:address:editor-data/lookup, left:offset
+  right:number <- get recipes:address:editor-data/lookup, right:offset
   row:number, screen:address <- render screen:address, recipes:address:editor-data
-  recipe-warnings:address:array:character <- get env:address:programming-environment-data/deref, recipe-warnings:offset
+  recipe-warnings:address:array:character <- get env:address:programming-environment-data/lookup, recipe-warnings:offset
   {
     # print any warnings
     break-unless recipe-warnings:address:array:character
@@ -1298,15 +1298,15 @@ recipe update-cursor [
     break-if sandbox-in-focus?:boolean
 #?     $print [recipes in focus
 #? ] #? 1
-    cursor-row:number <- get recipes:address:editor-data/deref, cursor-row:offset
-    cursor-column:number <- get recipes:address:editor-data/deref, cursor-column:offset
+    cursor-row:number <- get recipes:address:editor-data/lookup, cursor-row:offset
+    cursor-column:number <- get recipes:address:editor-data/lookup, cursor-column:offset
   }
   {
     break-unless sandbox-in-focus?:boolean
 #?     $print [sandboxes in focus
 #? ] #? 1
-    cursor-row:number <- get current-sandbox:address:editor-data/deref, cursor-row:offset
-    cursor-column:number <- get current-sandbox:address:editor-data/deref, cursor-column:offset
+    cursor-row:number <- get current-sandbox:address:editor-data/lookup, cursor-row:offset
+    cursor-column:number <- get current-sandbox:address:editor-data/lookup, cursor-column:offset
   }
   move-cursor screen:address, cursor-row:number, cursor-column:number
 ]
@@ -1335,8 +1335,8 @@ scenario editor-handles-mouse-clicks [
   ]
   run [
     editor-event-loop screen:address, console:address, 2:address:editor-data
-    3:number <- get 2:address:editor-data/deref, cursor-row:offset
-    4:number <- get 2:address:editor-data/deref, cursor-column:offset
+    3:number <- get 2:address:editor-data/lookup, cursor-row:offset
+    4:number <- get 2:address:editor-data/lookup, cursor-column:offset
   ]
   screen-should-contain [
     .          .
@@ -1358,8 +1358,8 @@ scenario editor-handles-mouse-clicks-outside-text [
   ]
   run [
     editor-event-loop screen:address, console:address, 2:address:editor-data
-    3:number <- get 2:address:editor-data/deref, cursor-row:offset
-    4:number <- get 2:address:editor-data/deref, cursor-column:offset
+    3:number <- get 2:address:editor-data/lookup, cursor-row:offset
+    4:number <- get 2:address:editor-data/lookup, cursor-column:offset
   ]
   memory-should-contain [
     3 <- 1  # cursor row
@@ -1377,8 +1377,8 @@ def]
   ]
   run [
     editor-event-loop screen:address, console:address, 2:address:editor-data
-    3:number <- get 2:address:editor-data/deref, cursor-row:offset
-    4:number <- get 2:address:editor-data/deref, cursor-column:offset
+    3:number <- get 2:address:editor-data/lookup, cursor-row:offset
+    4:number <- get 2:address:editor-data/lookup, cursor-column:offset
   ]
   memory-should-contain [
     3 <- 1  # cursor row
@@ -1396,8 +1396,8 @@ def]
   ]
   run [
     editor-event-loop screen:address, console:address, 2:address:editor-data
-    3:number <- get 2:address:editor-data/deref, cursor-row:offset
-    4:number <- get 2:address:editor-data/deref, cursor-column:offset
+    3:number <- get 2:address:editor-data/lookup, cursor-row:offset
+    4:number <- get 2:address:editor-data/lookup, cursor-column:offset
   ]
   memory-should-contain [
     3 <- 2  # cursor row
@@ -1416,8 +1416,8 @@ scenario editor-handles-mouse-clicks-outside-column [
   ]
   run [
     editor-event-loop screen:address, console:address, 2:address:editor-data
-    3:number <- get 2:address:editor-data/deref, cursor-row:offset
-    4:number <- get 2:address:editor-data/deref, cursor-column:offset
+    3:number <- get 2:address:editor-data/lookup, cursor-row:offset
+    4:number <- get 2:address:editor-data/lookup, cursor-column:offset
   ]
   screen-should-contain [
     .          .
@@ -1603,8 +1603,8 @@ scenario editor-wraps-cursor-after-inserting-characters [
   ]
   run [
     editor-event-loop screen:address, console:address, 2:address:editor-data
-    3:number <- get 2:address:editor-data/deref, cursor-row:offset
-    4:number <- get 2:address:editor-data/deref, cursor-column:offset
+    3:number <- get 2:address:editor-data/lookup, cursor-row:offset
+    4:number <- get 2:address:editor-data/lookup, cursor-column:offset
   ]
   screen-should-contain [
     .          .
@@ -1628,8 +1628,8 @@ scenario editor-wraps-cursor-after-inserting-characters-2 [
   ]
   run [
     editor-event-loop screen:address, console:address, 2:address:editor-data
-    3:number <- get 2:address:editor-data/deref, cursor-row:offset
-    4:number <- get 2:address:editor-data/deref, cursor-column:offset
+    3:number <- get 2:address:editor-data/lookup, cursor-row:offset
+    4:number <- get 2:address:editor-data/lookup, cursor-column:offset
   ]
   screen-should-contain [
     .          .
@@ -1724,8 +1724,8 @@ ef]
   ]
   run [
     editor-event-loop screen:address, console:address, 2:address:editor-data
-    3:number <- get 2:address:editor-data/deref, cursor-row:offset
-    4:number <- get 2:address:editor-data/deref, cursor-column:offset
+    3:number <- get 2:address:editor-data/lookup, cursor-row:offset
+    4:number <- get 2:address:editor-data/lookup, cursor-column:offset
   ]
   # cursor should be below start of previous line
   memory-should-contain [
@@ -1746,8 +1746,8 @@ scenario editor-handles-backspace-key [
   replace-in-console 171/«, 3:event/backspace
   run [
     editor-event-loop screen:address, console:address, 2:address:editor-data
-    4:number <- get 2:address:editor-data/deref, cursor-row:offset
-    5:number <- get 2:address:editor-data/deref, cursor-column:offset
+    4:number <- get 2:address:editor-data/lookup, cursor-row:offset
+    5:number <- get 2:address:editor-data/lookup, cursor-column:offset
   ]
   screen-should-contain [
     .          .
@@ -1877,8 +1877,8 @@ scenario editor-moves-cursor-to-next-wrapped-line-with-right-arrow [
   ]
   run [
     editor-event-loop screen:address, console:address, 2:address:editor-data
-    3:number <- get 2:address:editor-data/deref, cursor-row:offset
-    4:number <- get 2:address:editor-data/deref, cursor-column:offset
+    3:number <- get 2:address:editor-data/lookup, cursor-row:offset
+    4:number <- get 2:address:editor-data/lookup, cursor-column:offset
   ]
   screen-should-contain [
     .          .
@@ -1904,8 +1904,8 @@ scenario editor-moves-cursor-to-next-wrapped-line-with-right-arrow-2 [
   ]
   run [
     editor-event-loop screen:address, console:address, 2:address:editor-data
-    3:number <- get 2:address:editor-data/deref, cursor-row:offset
-    4:number <- get 2:address:editor-data/deref, cursor-column:offset
+    3:number <- get 2:address:editor-data/lookup, cursor-row:offset
+    4:number <- get 2:address:editor-data/lookup, cursor-column:offset
   ]
   memory-should-contain [
     3 <- 2
@@ -1917,8 +1917,8 @@ scenario editor-moves-cursor-to-next-wrapped-line-with-right-arrow-2 [
   ]
   run [
     editor-event-loop screen:address, console:address, 2:address:editor-data
-    3:number <- get 2:address:editor-data/deref, cursor-row:offset
-    4:number <- get 2:address:editor-data/deref, cursor-column:offset
+    3:number <- get 2:address:editor-data/lookup, cursor-row:offset
+    4:number <- get 2:address:editor-data/lookup, cursor-column:offset
   ]
   memory-should-contain [
     3 <- 2
@@ -1936,8 +1936,8 @@ scenario editor-moves-cursor-to-next-wrapped-line-with-right-arrow-3 [
   ]
   run [
     editor-event-loop screen:address, console:address, 2:address:editor-data
-    3:number <- get 2:address:editor-data/deref, cursor-row:offset
-    4:number <- get 2:address:editor-data/deref, cursor-column:offset
+    3:number <- get 2:address:editor-data/lookup, cursor-row:offset
+    4:number <- get 2:address:editor-data/lookup, cursor-column:offset
   ]
   screen-should-contain [
     .          .
@@ -2004,8 +2004,8 @@ d]
   ]
   run [
     editor-event-loop screen:address, console:address, 2:address:editor-data
-    3:number <- get 2:address:editor-data/deref, cursor-row:offset
-    4:number <- get 2:address:editor-data/deref, cursor-column:offset
+    3:number <- get 2:address:editor-data/lookup, cursor-row:offset
+    4:number <- get 2:address:editor-data/lookup, cursor-column:offset
   ]
   memory-should-contain [
     3 <- 1
@@ -2106,8 +2106,8 @@ scenario editor-moves-across-screen-lines-across-wrap-with-left-arrow [
   ]
   run [
     editor-event-loop screen:address, console:address, 2:address:editor-data
-    3:number <- get 2:address:editor-data/deref, cursor-row:offset
-    4:number <- get 2:address:editor-data/deref, cursor-column:offset
+    3:number <- get 2:address:editor-data/lookup, cursor-row:offset
+    4:number <- get 2:address:editor-data/lookup, cursor-column:offset
   ]
   memory-should-contain [
     3 <- 1  # previous row
@@ -2126,8 +2126,8 @@ def]
   ]
   run [
     editor-event-loop screen:address, console:address, 2:address:editor-data
-    3:number <- get 2:address:editor-data/deref, cursor-row:offset
-    4:number <- get 2:address:editor-data/deref, cursor-column:offset
+    3:number <- get 2:address:editor-data/lookup, cursor-row:offset
+    4:number <- get 2:address:editor-data/lookup, cursor-column:offset
   ]
   memory-should-contain [
     3 <- 1
@@ -2146,8 +2146,8 @@ def]
   ]
   run [
     editor-event-loop screen:address, console:address, 2:address:editor-data
-    3:number <- get 2:address:editor-data/deref, cursor-row:offset
-    4:number <- get 2:address:editor-data/deref, cursor-column:offset
+    3:number <- get 2:address:editor-data/lookup, cursor-row:offset
+    4:number <- get 2:address:editor-data/lookup, cursor-column:offset
   ]
   # ..and ends at (2, 0)
   memory-should-contain [
@@ -2167,8 +2167,8 @@ def]
   ]
   run [
     editor-event-loop screen:address, console:address, 2:address:editor-data
-    3:number <- get 2:address:editor-data/deref, cursor-row:offset
-    4:number <- get 2:address:editor-data/deref, cursor-column:offset
+    3:number <- get 2:address:editor-data/lookup, cursor-row:offset
+    4:number <- get 2:address:editor-data/lookup, cursor-column:offset
   ]
   memory-should-contain [
     3 <- 1
@@ -2187,8 +2187,8 @@ de]
   ]
   run [
     editor-event-loop screen:address, console:address, 2:address:editor-data
-    3:number <- get 2:address:editor-data/deref, cursor-row:offset
-    4:number <- get 2:address:editor-data/deref, cursor-column:offset
+    3:number <- get 2:address:editor-data/lookup, cursor-row:offset
+    4:number <- get 2:address:editor-data/lookup, cursor-column:offset
   ]
   memory-should-contain [
     3 <- 2
@@ -2210,8 +2210,8 @@ scenario editor-moves-to-start-of-line-with-ctrl-a [
   replace-in-console 97/a, 3:event/ctrl-a
   run [
     editor-event-loop screen:address, console:address, 2:address:editor-data
-    4:number <- get 2:address:editor-data/deref, cursor-row:offset
-    5:number <- get 2:address:editor-data/deref, cursor-column:offset
+    4:number <- get 2:address:editor-data/lookup, cursor-row:offset
+    5:number <- get 2:address:editor-data/lookup, cursor-column:offset
   ]
   # cursor moves to start of line
   memory-should-contain [
@@ -2234,8 +2234,8 @@ scenario editor-moves-to-start-of-line-with-ctrl-a-2 [
   replace-in-console 97/a, 3:event/ctrl-a
   run [
     editor-event-loop screen:address, console:address, 2:address:editor-data
-    4:number <- get 2:address:editor-data/deref, cursor-row:offset
-    5:number <- get 2:address:editor-data/deref, cursor-column:offset
+    4:number <- get 2:address:editor-data/lookup, cursor-row:offset
+    5:number <- get 2:address:editor-data/lookup, cursor-column:offset
   ]
   # cursor moves to start of line
   memory-should-contain [
@@ -2256,8 +2256,8 @@ scenario editor-moves-to-start-of-line-with-home [
   ]
   run [
     editor-event-loop screen:address, console:address, 2:address:editor-data
-    3:number <- get 2:address:editor-data/deref, cursor-row:offset
-    4:number <- get 2:address:editor-data/deref, cursor-column:offset
+    3:number <- get 2:address:editor-data/lookup, cursor-row:offset
+    4:number <- get 2:address:editor-data/lookup, cursor-column:offset
   ]
   # cursor moves to start of line
   memory-should-contain [
@@ -2278,8 +2278,8 @@ scenario editor-moves-to-start-of-line-with-home-2 [
   ]
   run [
     editor-event-loop screen:address, console:address, 2:address:editor-data
-    3:number <- get 2:address:editor-data/deref, cursor-row:offset
-    4:number <- get 2:address:editor-data/deref, cursor-column:offset
+    3:number <- get 2:address:editor-data/lookup, cursor-row:offset
+    4:number <- get 2:address:editor-data/lookup, cursor-column:offset
   ]
   # cursor moves to start of line
   memory-should-contain [
@@ -2302,8 +2302,8 @@ scenario editor-moves-to-start-of-line-with-ctrl-e [
   replace-in-console 101/e, 3:event/ctrl-e
   run [
     editor-event-loop screen:address, console:address, 2:address:editor-data
-    4:number <- get 2:address:editor-data/deref, cursor-row:offset
-    5:number <- get 2:address:editor-data/deref, cursor-column:offset
+    4:number <- get 2:address:editor-data/lookup, cursor-row:offset
+    5:number <- get 2:address:editor-data/lookup, cursor-column:offset
   ]
   # cursor moves to end of line
   memory-should-contain [
@@ -2316,8 +2316,8 @@ scenario editor-moves-to-start-of-line-with-ctrl-e [
   ]
   run [
     editor-event-loop screen:address, console:address, 2:address:editor-data
-    4:number <- get 2:address:editor-data/deref, cursor-row:offset
-    5:number <- get 2:address:editor-data/deref, cursor-column:offset
+    4:number <- get 2:address:editor-data/lookup, cursor-row:offset
+    5:number <- get 2:address:editor-data/lookup, cursor-column:offset
   ]
   memory-should-contain [
     4 <- 1
@@ -2345,8 +2345,8 @@ scenario editor-moves-to-end-of-line-with-ctrl-e-2 [
   replace-in-console 101/e, 3:event/ctrl-e
   run [
     editor-event-loop screen:address, console:address, 2:address:editor-data
-    4:number <- get 2:address:editor-data/deref, cursor-row:offset
-    5:number <- get 2:address:editor-data/deref, cursor-column:offset
+    4:number <- get 2:address:editor-data/lookup, cursor-row:offset
+    5:number <- get 2:address:editor-data/lookup, cursor-column:offset
   ]
   # cursor moves to end of line
   memory-should-contain [
@@ -2367,8 +2367,8 @@ scenario editor-moves-to-end-of-line-with-end [
   ]
   run [
     editor-event-loop screen:address, console:address, 2:address:editor-data
-    3:number <- get 2:address:editor-data/deref, cursor-row:offset
-    4:number <- get 2:address:editor-data/deref, cursor-column:offset
+    3:number <- get 2:address:editor-data/lookup, cursor-row:offset
+    4:number <- get 2:address:editor-data/lookup, cursor-column:offset
   ]
   # cursor moves to end of line
   memory-should-contain [
@@ -2389,8 +2389,8 @@ scenario editor-moves-to-end-of-line-with-end-2 [
   ]
   run [
     editor-event-loop screen:address, console:address, 2:address:editor-data
-    3:number <- get 2:address:editor-data/deref, cursor-row:offset
-    4:number <- get 2:address:editor-data/deref, cursor-column:offset
+    3:number <- get 2:address:editor-data/lookup, cursor-row:offset
+    4:number <- get 2:address:editor-data/lookup, cursor-column:offset
   ]
   # cursor moves to end of line
   memory-should-contain [
@@ -2630,10 +2630,10 @@ scenario point-at-multiple-editors [
   # check cursor column in each
   run [
     event-loop screen:address, console:address, 3:address:programming-environment-data
-    4:address:editor-data <- get 3:address:programming-environment-data/deref, recipes:offset
-    5:number <- get 4:address:editor-data/deref, cursor-column:offset
-    6:address:editor-data <- get 3:address:programming-environment-data/deref, current-sandbox:offset
-    7:number <- get 6:address:editor-data/deref, cursor-column:offset
+    4:address:editor-data <- get 3:address:programming-environment-data/lookup, recipes:offset
+    5:number <- get 4:address:editor-data/lookup, cursor-column:offset
+    6:address:editor-data <- get 3:address:programming-environment-data/lookup, current-sandbox:offset
+    7:number <- get 6:address:editor-data/lookup, cursor-column:offset
   ]
   memory-should-contain [
     5 <- 1
@@ -2657,10 +2657,10 @@ scenario edit-multiple-editors [
   ]
   run [
     event-loop screen:address, console:address, 3:address:programming-environment-data
-    4:address:editor-data <- get 3:address:programming-environment-data/deref, recipes:offset
-    5:number <- get 4:address:editor-data/deref, cursor-column:offset
-    6:address:editor-data <- get 3:address:programming-environment-data/deref, current-sandbox:offset
-    7:number <- get 6:address:editor-data/deref, cursor-column:offset
+    4:address:editor-data <- get 3:address:programming-environment-data/lookup, recipes:offset
+    5:number <- get 4:address:editor-data/lookup, cursor-column:offset
+    6:address:editor-data <- get 3:address:programming-environment-data/lookup, current-sandbox:offset
+    7:number <- get 6:address:editor-data/lookup, cursor-column:offset
   ]
   screen-should-contain [
     .           run (F4)           .  # this line has a different background, but we don't test that yet
@@ -2829,15 +2829,15 @@ scenario run-and-show-results [
 recipe run-sandboxes [
   local-scope
   env:address:programming-environment-data <- next-ingredient
-  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
+  recipes:address:editor-data <- get env:address:programming-environment-data/lookup, recipes:offset
+  current-sandbox:address:editor-data <- get env:address:programming-environment-data/lookup, current-sandbox:offset
   # copy code from recipe editor, persist, load into mu, save any warnings
   in:address:array:character <- editor-contents recipes:address:editor-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
+  recipe-warnings:address:address:array:character <- get-address env:address:programming-environment-data/lookup, recipe-warnings:offset
+  recipe-warnings:address:address:array:character/lookup <- reload in:address:array:character
   # if recipe editor has errors, stop
-  reply-if recipe-warnings:address:address:array:character/deref
+  reply-if recipe-warnings:address:address:array:character/lookup
   # check contents of right editor (sandbox)
   {
     sandbox-contents:address:array:character <- editor-contents current-sandbox:address:editor-data
@@ -2845,41 +2845,41 @@ recipe run-sandboxes [
     # if contents exist, first save them
     # run them and turn them into a new sandbox-data
     new-sandbox:address:sandbox-data <- new sandbox-data:type
-    data:address:address:array:character <- get-address new-sandbox:address:sandbox-data/deref, data:offset
-    data:address:address:array:character/deref <- copy sandbox-contents:address:array:character
+    data:address:address:array:character <- get-address new-sandbox:address:sandbox-data/lookup, data:offset
+    data:address:address:array:character/lookup <- copy sandbox-contents:address:array:character
     # push to head of sandbox list
-    dest:address:address:sandbox-data <- get-address env:address:programming-environment-data/deref, sandbox:offset
-    next:address:address:sandbox-data <- get-address new-sandbox:address:sandbox-data/deref, next-sandbox:offset
-    next:address:address:sandbox-data/deref <- copy dest:address:address:sandbox-data/deref
-    dest:address:address:sandbox-data/deref <- copy new-sandbox:address:sandbox-data
+    dest:address:address:sandbox-data <- get-address env:address:programming-environment-data/lookup, sandbox:offset
+    next:address:address:sandbox-data <- get-address new-sandbox:address:sandbox-data/lookup, next-sandbox:offset
+    next:address:address:sandbox-data/lookup <- copy dest:address:address:sandbox-data/lookup
+    dest:address:address:sandbox-data/lookup <- copy new-sandbox:address:sandbox-data
     # clear sandbox editor
-    init:address:address:duplex-list <- get-address current-sandbox:address:editor-data/deref, data:offset
-    init:address:address:duplex-list/deref <- push-duplex 167/§, 0/tail
+    init:address:address:duplex-list <- get-address current-sandbox:address:editor-data/lookup, data:offset
+    init:address:address:duplex-list/lookup <- push-duplex 167/§, 0/tail
   }
   # save all sandboxes before running, just in case we die when running
   # first clear previous versions, in case we deleted some sandbox
   $system [rm lesson/[0-9]*]
-  curr:address:sandbox-data <- get env:address:programming-environment-data/deref, sandbox:offset
+  curr:address:sandbox-data <- get env:address:programming-environment-data/lookup, sandbox:offset
   filename:number <- copy 0
   {
     break-unless curr:address:sandbox-data
-    data:address:address:array:character <- get-address curr:address:sandbox-data/deref, data:offset
-    save filename:number, data:address:address:array:character/deref
+    data:address:address:array:character <- get-address curr:address:sandbox-data/lookup, data:offset
+    save filename:number, data:address:address:array:character/lookup
     filename:number <- add filename:number, 1
-    curr:address:sandbox-data <- get curr:address:sandbox-data/deref, next-sandbox:offset
+    curr:address:sandbox-data <- get curr:address:sandbox-data/lookup, next-sandbox:offset
     loop
   }
   # run all sandboxes
-  curr:address:sandbox-data <- get env:address:programming-environment-data/deref, sandbox:offset
+  curr:address:sandbox-data <- get env:address:programming-environment-data/lookup, sandbox:offset
   {
     break-unless curr:address:sandbox-data
-    data:address:address:array:character <- get-address curr:address:sandbox-data/deref, data:offset
-    response:address:address:array:character <- get-address curr:address:sandbox-data/deref, response:offset
-    warnings:address:address:array:character <- get-address curr:address:sandbox-data/deref, warnings:offset
-    fake-screen:address:address:screen <- get-address curr:address:sandbox-data/deref, screen:offset
-    response:address:address:array:character/deref, warnings:address:address:array:character/deref, fake-screen:address:address:screen/deref <- run-interactive data:address:address:array:character/deref
-#?     $print warnings:address:address:array:character/deref, [ ], warnings:address:address:array:character/deref/deref, 10/newline
-    curr:address:sandbox-data <- get curr:address:sandbox-data/deref, next-sandbox:offset
+    data:address:address:array:character <- get-address curr:address:sandbox-data/lookup, data:offset
+    response:address:address:array:character <- get-address curr:address:sandbox-data/lookup, response:offset
+    warnings:address:address:array:character <- get-address curr:address:sandbox-data/lookup, warnings:offset
+    fake-screen:address:address:screen <- get-address curr:address:sandbox-data/lookup, screen:offset
+    response:address:address:array:character/lookup, warnings:address:address:array:character/lookup, fake-screen:address:address:screen/lookup <- run-interactive data:address:address:array:character/lookup
+#?     $print warnings:address:address:array:character/lookup, [ ], warnings:address:address:array:character/lookup/lookup, 10/newline
+    curr:address:sandbox-data <- get curr:address:sandbox-data/lookup, next-sandbox:offset
     loop
   }
 ]
@@ -2890,13 +2890,13 @@ recipe render-sandbox-side [
   env:address:programming-environment-data <- next-ingredient
   clear:boolean <- next-ingredient
 #?   trace [app], [render sandbox side] #? 1
-  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
+  current-sandbox:address:editor-data <- get env:address:programming-environment-data/lookup, current-sandbox:offset
+  left:number <- get current-sandbox:address:editor-data/lookup, left:offset
+  right:number <- get current-sandbox:address:editor-data/lookup, right:offset
   row:number, screen:address <- render screen:address, current-sandbox:address:editor-data
   row:number <- add row:number, 1
   draw-horizontal screen:address, row:number, left:number, right:number, 9473/horizontal-double
-  sandbox:address:sandbox-data <- get env:address:programming-environment-data/deref, sandbox:offset
+  sandbox:address:sandbox-data <- get env:address:programming-environment-data/lookup, 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
@@ -2933,15 +2933,15 @@ recipe render-sandboxes [
   clear-line-delimited screen:address, left:number, right:number
   print-character screen:address, 120/x, 245/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
+  starting-row:address:number <- get-address sandbox:address:sandbox-data/lookup, starting-row-on-screen:offset
+  starting-row:address:number/lookup <- copy row:number
   # render sandbox contents
-  sandbox-data:address:array:character <- get sandbox:address:sandbox-data/deref, data:offset
+  sandbox-data:address:array:character <- get sandbox:address:sandbox-data/lookup, data:offset
   row:number, screen:address <- render-string screen:address, sandbox-data:address:array:character, left:number, right:number, 7/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
+  sandbox-response:address:array:character <- get sandbox:address:sandbox-data/lookup, response:offset
+  sandbox-warnings:address:array:character <- get sandbox:address:sandbox-data/lookup, warnings:offset
+  sandbox-screen:address <- get sandbox:address:sandbox-data/lookup, 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/red, row:number
@@ -2962,7 +2962,7 @@ recipe render-sandboxes [
   # draw solid line after sandbox
   draw-horizontal screen:address, row:number, left:number, right:number, 9473/horizontal-double
   # draw next sandbox
-  next-sandbox:address:sandbox-data <- get sandbox:address:sandbox-data/deref, next-sandbox:offset
+  next-sandbox:address:sandbox-data <- get sandbox:address:sandbox-data/lookup, 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
 ]
@@ -2973,18 +2973,18 @@ recipe restore-sandboxes [
   env:address:programming-environment-data <- next-ingredient
   # read all scenarios, pushing them to end of a list of scenarios
   filename:number <- copy 0
-  curr:address:address:sandbox-data <- get-address env:address:programming-environment-data/deref, sandbox:offset
+  curr:address:address:sandbox-data <- get-address env:address:programming-environment-data/lookup, 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/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
+    curr:address:address:sandbox-data/lookup <- new sandbox-data:type
+    data:address:address:array:character <- get-address curr:address:address:sandbox-data/lookup/lookup, data:offset
+    data:address:address:array:character/lookup <- copy contents:address:array:character
     # increment loop variables
     filename:number <- add filename:number, 1
-    curr:address:address:sandbox-data <- get-address curr:address:address:sandbox-data/deref/deref, next-sandbox:offset
+    curr:address:address:sandbox-data <- get-address curr:address:address:sandbox-data/lookup/lookup, next-sandbox:offset
     loop
   }
   reply env:address:programming-environment-data/same-as-ingredient:0
@@ -2996,17 +2996,17 @@ recipe delete-sandbox [
   t:touch-event <- next-ingredient
   env:address:programming-environment-data <- next-ingredient
   click-column:number <- get t:touch-event, column:offset
-  current-sandbox:address:editor-data <- get env:address:programming-environment-data/deref, current-sandbox:offset
-  right:number <- get current-sandbox:address:editor-data/deref, right:offset
+  current-sandbox:address:editor-data <- get env:address:programming-environment-data/lookup, current-sandbox:offset
+  right:number <- get current-sandbox:address:editor-data/lookup, right:offset
 #?   $print [comparing column ], click-column:number, [ vs ], right:number, 10/newline
   at-right?:boolean <- equal click-column:number, right:number
   reply-unless at-right?:boolean, 0/false
 #?   $print [trying to delete
 #? ] #? 1
   click-row:number <- get t:touch-event, row:offset
-  prev:address:address:sandbox-data <- get-address env:address:programming-environment-data/deref, sandbox:offset
-#?   $print [prev: ], prev:address:address:sandbox-data, [ -> ], prev:address:address:sandbox-data/deref, 10/newline
-  curr:address:sandbox-data <- get env:address:programming-environment-data/deref, sandbox:offset
+  prev:address:address:sandbox-data <- get-address env:address:programming-environment-data/lookup, sandbox:offset
+#?   $print [prev: ], prev:address:address:sandbox-data, [ -> ], prev:address:address:sandbox-data/lookup, 10/newline
+  curr:address:sandbox-data <- get env:address:programming-environment-data/lookup, sandbox:offset
   {
 #?     $print [next sandbox
 #? ] #? 1
@@ -3015,20 +3015,20 @@ recipe delete-sandbox [
     {
 #?       $print [checking
 #? ] #? 1
-      target-row:number <- get curr:address:sandbox-data/deref, starting-row-on-screen:offset
+      target-row:number <- get curr:address:sandbox-data/lookup, starting-row-on-screen:offset
 #?       $print [comparing row ], target-row:number, [ vs ], click-row:number, 10/newline
       delete-curr?:boolean <- equal target-row:number, click-row:number
       break-unless delete-curr?:boolean
 #?       $print [found!
 #? ] #? 1
       # delete this sandbox, rerender and stop
-      prev:address:address:sandbox-data/deref <- get curr:address:sandbox-data/deref, next-sandbox:offset
-#?       $print [setting prev: ], prev:address:address:sandbox-data, [ -> ], prev:address:address:sandbox-data/deref, 10/newline
+      prev:address:address:sandbox-data/lookup <- get curr:address:sandbox-data/lookup, next-sandbox:offset
+#?       $print [setting prev: ], prev:address:address:sandbox-data, [ -> ], prev:address:address:sandbox-data/lookup, 10/newline
       reply 1/true
     }
-    prev:address:address:sandbox-data <- get-address curr:address:sandbox-data/deref, next-sandbox:offset
-#?     $print [prev: ], prev:address:address:sandbox-data, [ -> ], prev:address:address:sandbox-data/deref, 10/newline
-    curr:address:sandbox-data <- get curr:address:sandbox-data/deref, next-sandbox:offset
+    prev:address:address:sandbox-data <- get-address curr:address:sandbox-data/lookup, next-sandbox:offset
+#?     $print [prev: ], prev:address:address:sandbox-data, [ -> ], prev:address:address:sandbox-data/lookup, 10/newline
+    curr:address:sandbox-data <- get curr:address:sandbox-data/lookup, next-sandbox:offset
     loop
   }
   reply 0/false
@@ -3277,14 +3277,14 @@ recipe editor-contents [
   local-scope
   editor:address:editor-data <- next-ingredient
   buf:address:buffer <- new-buffer 80
-  curr:address:duplex-list <- get editor:address:editor-data/deref, data:offset
+  curr:address:duplex-list <- get editor:address:editor-data/lookup, data:offset
   # skip § sentinel
   assert curr:address:duplex-list, [editor without data is illegal; must have at least a sentinel]
   curr:address:duplex-list <- next-duplex curr:address:duplex-list
   reply-unless curr:address:duplex-list, 0
   {
     break-unless curr:address:duplex-list
-    c:character <- get curr:address:duplex-list/deref, value:offset
+    c:character <- get curr:address:duplex-list/lookup, value:offset
     buffer-append buf:address:buffer, c:character
     curr:address:duplex-list <- next-duplex curr:address:duplex-list
     loop
@@ -3304,7 +3304,7 @@ scenario editor-provides-edited-contents [
   run [
     editor-event-loop screen:address, console:address, 2:address:editor-data
     3:address:array:character <- editor-contents 2:address:editor-data
-    4:array:character <- copy 3:address:array:character/deref
+    4:array:character <- copy 3:address:array:character/lookup
   ]
   memory-should-contain [
     4:string <- [abdefc]
@@ -3418,7 +3418,7 @@ scenario run-shows-non-literal-get-argument-warnings [
 recipe foo [
   x:number <- copy 0
   y:address:point <- new point:type
-  get y:address:point/deref, x:number
+  get y:address:point/lookup, 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
@@ -3430,7 +3430,7 @@ recipe foo [
     .recipe foo [                                      ┊━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━.
     .  x:number <- copy 0                              ┊                                                 .
     .  y:address:point <- new point:type               ┊                                                 .
-    .  get y:address:point/deref, x:number             ┊                                                 .
+    .  get y:address:point/lookup, x:number            ┊                                                 .
     .]                                                 ┊                                                 .
     .foo: expected ingredient 1 of 'get' to have type ↩┊                                                 .
     .'offset'; got x:number                            ┊                                                 .
@@ -3595,7 +3595,7 @@ recipe print-string-with-gradient-background [
   color:number <- next-ingredient
   bg-color1:number <- next-ingredient
   bg-color2:number <- next-ingredient
-  len:number <- length s:address:array:character/deref
+  len:number <- length s:address:array:character/lookup
   color-range:number <- subtract bg-color2:number, bg-color1:number
   color-quantum:number <- divide color-range:number, len:number
 #?   close-console #? 2
@@ -3606,7 +3606,7 @@ recipe print-string-with-gradient-background [
   {
     done?:boolean <- greater-or-equal i:number, len:number
     break-if done?:boolean
-    c:character <- index s:address:array:character/deref, i:number
+    c:character <- index s:address:array:character/lookup, i:number
     print-character x:address:screen, c:character, color:number, bg-color:number
     i:number <- add i:number, 1
     bg-color:number <- add bg-color:number, color-quantum:number