Common Lispでは構造体の配列が使える。下のプログラムはその一例である。
(add-data)でデータを一つ入力し、(display)で全データを表示する。
名簿プログラムである。
; structs.lsp
(defparameter *n* 1000)
(defparameter *data-base* (make-array *n*))
(defstruct person
name
age
sex
)
(defun find-name (name)
(let ((i 0))
(loop
(if (eql i *n*) (return nil))
(if (and (not (null (aref *data-base* i)))
(eql name (person-name (aref *data-base* i))) ) (return i))
(setq i (1+ i)) ) ) )
(defun find-it (name)
(let ((d) (k))
(cond
((null (setq d (find-name name)))
(cond
((null (setq k (find-null))) (print '(not enouph memory)) nil)
(t k) ) )
(t d) ) ) )
(defun find-null ()
(let ((i 0))
(loop
(if (eql i *n*) (return nil))
(if (null (aref *data-base* i)) (return i))
(setq i (1+ i)) ) ) )
(defun add-data () ; Use this command.
(let ((name) (age) (sex) (k))
(princ 'name=) (setq name (read))
(princ 'age=) (setq age (read))
(princ 'sex=) (setq sex (read))
(if (null (setq k (find-it name))) nil
(progn
(setf (aref *data-base* k) (make-person))
(setf (person-name (aref *data-base* k)) name)
(setf (person-age (aref *data-base* k)) age)
(setf (person-sex (aref *data-base* k)) sex)
t ) ) ) )
(defun display () ; Use this command.
(let ((i 0))
(loop
(if (eql i *n*) (return t))
(if (not (null (aref *data-base* i)))
(progn
(terpri)
(princ (1+ i)) (terpri)
(princ 'name=) (princ (person-name (aref *data-base* i))) (terpri)
(princ 'age=) (princ (person-age (aref *data-base* i))) (terpri)
(princ 'sex=) (princ (person-sex (aref *data-base* i))) (terpri) ) )
(setq i (1+ i)) ) ) )