56 - 'get' for record access

This commit is contained in:
Kartik K. Agaram 2014-08-19 21:33:48 -07:00
parent 6b133a720e
commit f9dd51f672
2 changed files with 29 additions and 6 deletions

23
mu.arc
View File

@ -7,12 +7,17 @@
(def clear ()
(= types* (obj
type (obj size 1 record nil array nil address nil)
location (obj size 1 record nil array nil address nil)
integer (obj size 1 record nil array nil address nil)
boolean (obj size 1 record nil array nil address nil)
integer-array (obj array t elem 'integer) ; array of ints, size in front
integer-address (obj size 1 address t elem 'integer) ; pointer to int
; must be scalar or vector, sum or product or primitive
type (obj size 1)
location (obj size 1)
integer (obj size 1)
boolean (obj size 1)
integer-array (obj vector t elem 'integer) ; vectors provide size at front
integer-address (obj size 1 address t elem 'integer) ; pointer to int
block (obj size 1024 vector t elem 'location) ; last elem points to next block when this one fills up
block-address (obj size 1 address t elem 'block)
integer-boolean-pair (obj size 2 record t elems '(integer boolean))
integer-boolean-pair-address (obj size 1 address t elem 'integer-boolean-pair)
))
(= memory* (table))
(= function* (table)))
@ -121,6 +126,12 @@
(continue))
copy
(m arg.0)
get
(withs (idx (v arg.1)
fields ((types* (ty arg.0)) 'elems)
offset (apply + (map [types*._ 'size]
(firstn idx fields))))
(memory* (+ (v arg.0) offset)))
reply
(do (= result arg)
(break))

View File

@ -331,6 +331,18 @@
(if (~iso memory* (obj 1 2 2 36 3 2))
(prn "F - instructions can performs indirect addressing on output arg"))
(reset)
(add-fns
'((main
((1 integer) <- literal 34)
((2 boolean) <- literal nil)
((3 boolean) <- get (1 integer-boolean-pair) (1 offset))
((4 integer) <- get (1 integer-boolean-pair) (0 offset)))))
(run function*!main)
;? (prn memory*)
(if (~iso memory* (obj 1 34 2 nil 3 nil 4 34))
(prn "F - 'get' accesses fields of records"))
(reset)
(add-fns
'((test1