(include-if (null (get 'chead 'version)) "../chead.l") (Liszt-file array "$Header: array.l,v 1.7 83/08/28 17:12:39 layer Exp $") ;;; ---- a r r a y array referencing ;;; ;;; -[Sat Aug 6 23:59:45 1983 by layer]- ;--- d-handlearrayref :: general array handler ; this function is called from d-exp when the car is an array (declare macarray) ; In the current array scheme, stores look like array references with one ; extra argument. Thus we must determine if we are accessing or storing in ; the array. ; Note that we must turn g-loc to reg and g-cc to nil since, even though ; d-supercxr handles g-loc and g-cc, d-superrplacx does not and we cannot ; know ahead of time which one we will use. If this seems important, ; we can beef up d-superrplacx ; (defun d-handlearrayref nil (let ((spec (get (car v-form) g-arrayspecs)) expr (g-loc 'reg) g-cc) (makecomment '(array ref)) (if (eq (1+ (length (cdr spec))) (length (cdr v-form))) then (d-dostore spec (cadr v-form) (cddr v-form)) else (setq expr (d-arrayindexcomp (cdr v-form) (cdr spec))) (let ((v-form `(cxr ,expr (getdata (getd ',(car v-form)))))) (d-supercxr (car spec) nil))))) ;--- d-dostore :: store value in array. ; spec - array descriptor from declare, e.g. (foo t 12 3 4) ; value - expression to calculate value to be stored. ; indexes - list of expressions which are the actual indicies. ; (defun d-dostore (spec value indexes) (let (expr gen) (makecomment '(doing store)) ; create an expression for doing index calculation. (setq expr (d-arrayindexcomp indexes (cdr spec)) gen (gensym)) ; calculate value to store and stack it. (d-pushargs (ncons value)) (rplaca g-locs gen) ; name just stacked varib ; do the store operation. (let ((v-form `(rplacx ,expr (getdata (getd ',(car v-form))) ,gen))) (d-superrplacx (car spec))) ; move the value we stored into r0 (d-move 'unstack 'reg) (setq g-locs (cdr g-locs)) (decr g-loccnt))) (defun d-arrayindexcomp (actual formal) (if (null (cdr actual)) then (car actual) ; always allow one arg elseif (eq (length actual) (length formal)) then (do ((ac actual (cdr ac)) (fo formal (cdr fo)) (res)) ((null ac) (cons '+ res)) (setq res (cons (if (null (cdr fo)) then (car ac) else `(* ,(car ac) ,(apply 'times (cdr fo)))) res))) else (comp-err "Wrong number of subscripts to array " actual)))