113 - slight progress working with screen 2D array

Why did it take forever to realize nobody will set the array length, that I
have to do it for myself?
This commit is contained in:
Kartik K. Agaram 2014-10-06 23:39:13 -07:00
parent ec690bf30d
commit 45b1e1f676
3 changed files with 70 additions and 6 deletions

22
edit.arc.t Normal file
View File

@ -0,0 +1,22 @@
(load "mu.arc")
(reset)
(add-fns:readfile "edit.mu")
(add-fns
'((test-new-screen
((curr-screen screen-address) <- new-screen (5 literal) (5 literal))
)))
(run 'test-new-screen)
(prn memory*)
;? (reset)
;? (add-fns:readfile "edit.mu")
;? (add-fns
;? '((test-redraw
;? ((curr-screen screen-address) <- new-screen (5 literal) (5 literal))
;? ((x line-address) <- get-address (curr-screen screen) (2 offset))
;? ((y character-address) <- get-address (x line-address deref) (4 offset))
;? ((y character-address deref) <- copy (literal "a"))
;? )))
;? (run 'test-redraw)
;? (prn memory*)

18
edit.mu
View File

@ -14,3 +14,21 @@
(print (key string))
(print ("\n" literal))
)
; a screen is an array of pointers to lines, in turn arrays of characters
(new-screen
((nrows integer) <- arg)
((ncols integer) <- arg)
((result screen-address) <- new (screen type) (nrows integer))
((result integer-address deref) <- copy (nrows integer))
((rowidx integer) <- literal 0)
((foo integer) <- literal 1000)
((curr-dest line-address-address) <- index (foo screen-address deref) (rowidx integer))
;? ((curr-dest line-address-address) <- index-address (result screen-address) (rowidx integer))
;? ((curr-dest line-address deref)
)
;? (redraw
;? (
;? )

36
mu.arc
View File

@ -61,7 +61,8 @@
boolean-address (obj size 1 address t)
byte (obj size 1)
;? string (obj array t elem 'byte) ; inspired by Go
char (obj size 1) ; int32 like a Go rune
character (obj size 1) ; int32 like a Go rune
character-address (obj size 1 address t elem 'character)
string (obj size 1) ; temporary hack
; arrays consist of an integer length followed by the right number of elems
integer-array (obj array t elem 'integer)
@ -73,6 +74,12 @@
integer-integer-pair (obj size 2 record t elems '(integer integer))
integer-point-pair (obj size 2 record t elems '(integer integer-integer-pair))
custodian (obj size 1 record t elems '(integer))
; editor
line (obj array t elem 'character)
line-address (obj size 1 address t elem 'line)
line-address-address (obj size 1 address t elem 'line-address)
screen (obj array t elem 'line-address)
screen-address (obj size 1 address t elem 'screen)
))
(= memory* (table))
(= function* (table)))
@ -96,10 +103,12 @@
(def sz (operand)
;? (prn "sz " operand)
; todo: override this for arrays
typeinfo.operand!size)
(if typeinfo.operand!array
array-len.operand
typeinfo.operand!size))
(defextend sz (typename) (isa typename 'sym)
types*.typename!size)
(or types*.typename!size
(err "type @typename doesn't have a size: " (tostring:pr types*.typename))))
(def addr (loc)
(if (pos 'deref metadata.loc)
@ -132,9 +141,17 @@
(= (memory* dest) src))))
(def array-len (operand)
(m `(,v.operand integer)))
;? (prn operand)
;? (prn (memory* 1000))
(if typeinfo.operand!array
(m `(,v.operand integer))
(and typeinfo.operand!address (pos 'deref metadata.operand))
(array-len (m operand) typeinfo.operand!elem)
:else
(err "can't take len of non-array @operand")))
(def array-ref-addr (operand idx)
;? (prn "aref addr: @operand @idx")
(assert typeinfo.operand!array)
(assert (< -1 idx (array-len operand)))
(withs (elem typeinfo.operand!elem
@ -142,10 +159,13 @@
(+ v.operand offset)))
(def array-ref (operand idx)
(prn "aref: @operand @idx")
(assert typeinfo.operand!array)
(assert (< -1 idx (array-len operand)))
(prn "aref2: @operand @idx")
(withs (elem typeinfo.operand!elem
offset (+ 1 (* idx sz.elem)))
(prn "aref3: @elem @v.operand @offset")
(m `(,(+ v.operand offset) ,elem))))
; context contains the call-stack of functions that haven't yet returned
@ -228,7 +248,7 @@
;? (prn "--- " top.context!fn-name " " pc.context ": " (body.context pc.context))
;? (prn " " memory*)
(let (oarg op arg) (parse-instr (body.context pc.context))
;? (prn op " " arg " -> " oarg)
(prn op " " arg " -> " oarg)
(let tmp
(case op
literal
@ -315,9 +335,12 @@
index
(with (base arg.0 ; integer (non-symbol) memory location including metadata
idx (m arg.1))
;? (prn "processing index: @base @idx")
(when typeinfo.base!address
(assert (pos 'deref metadata.base))
(= base (list (memory* v.base) typeinfo.base!elem)))
;? (prn "after maybe deref: @base @idx")
;? (prn Memory-in-use-until ": " memory*)
(if typeinfo.base!array
(array-ref base idx)
(assert nil "get on invalid type @arg.0 => @base")))
@ -407,6 +430,7 @@
(++ Memory-in-use-until sizeof.type)))
(def new-array (type size)
;? (prn "new array: @type @size")
(ret result Memory-in-use-until
(++ Memory-in-use-until (* (sizeof types*.type!elem) size))))