; .EnTete "Le-Lisp (c) version 15.2" " " "Les tableaux"
; .EnPied "array.ll" "F-%" " "
; .Annexe F "Les Tableaux"
; .nr % 1
;
; .Centre "*****************************************************************"
; .Centre " Ce fichier est en lecture seule hors du projet ALE de l'INRIA.  "
; .Centre " Il est maintenu par ILOG SA, 2 Avenue Gallie'ni, 94250 Gentilly "
; .Centre " (c) Le-Lisp est une marque de'pose'e de l'INRIA                 "
; .Centre "*****************************************************************"

; .Centre "$Header: array.ll,v 4.1 88/01/13 12:18:16 kuczynsk Rel $"

(unless (>= (version) 15.2)
        (error 'load 'erricf 'array))

; Toutes ces fonctions sont "autoload" dans le syste`me minimum.
; ce qui est bien pratique 

(de makearray (arg1 . #:system:larg)
    ; fabrique un tableau (d'au moins une dimension)
    (if #:system:larg
        (let ((result (makevector arg1 ())))
             (for (i 0 1 (1- arg1)) 
                  (vset result i (apply 'makearray #:system:larg)))
             result)
        arg1))

(dmd aref (inst . #:system:larg)
     ; acce`s a` un e'le'ment d'un tableau
     (cond ((null #:system:larg) inst)
           ((atom #:system:larg) (error 'aref 'errwna #:system:larg))
           (t `(vref (aref ,inst ,.(nreverse (cdr (reverse #:system:larg))))
                     ,(car (last #:system:larg))))))
         
(dmd aset (inst . #:system:larg)
     ; e'criture d'un e'le'ment d'un tableau
     (cond ((atom #:system:larg) (error 'aset 'errwna #:system:larg))
           ((consp (cdr #:system:larg))
              `(vset (aref ,inst ,.(nreverse (cddr (reverse #:system:larg))))
                    ,(cadr (reverse #:system:larg)) 
                    ,(car (last #:system:larg))))
           (t inst)))