From: R Hamilton
Subject: defstruct for xlisp
Date: 
Message-ID: <10490@castle.ed.ac.uk>
I hacked this up to run some lisp code on a PC with Xlisp (V2.0)).
It gives most of defstruct (allows slot defaults in defstruct but no
initialising :keywords in make-structname). I'm no lisp guru and the
code which quotes commas does look a bit iffy (certainly doesnt work in
LUCID!), but it's small and does at least work in xlisp so perhaps
somebody else may find it useful too.

;;; partial defstruct for Xlisp
;;; Robert Hamilton (····@uk.ac.ed.ee)
;
;;; doesnt support :keword initialisation in make-structname but allows
;;; defaults in defstruct 
;;; uses an array to store the structure
;;; Xlisp only 
;;;

(defmacro incf (x) `(setf ,x (+ 1 ,x)))	;need incf

(defmacro defstruct (name &rest parms &aux (counter -1) var)
  (setq var (quote ,pppxyz))		; diddles backquote on xlisp
;; make/eval a list of access macros suitable for setf like:
;; (defmacro name-slot1 (structname) `(aref ,structname slot-number))
  (mapcar #'(lambda (x) (eval `(defmacro 
				 ,(intern (strcat ; slot-name
					   (string (car name)) "-"
					   (if (atom x) (string x)
					     (string (car x)))))
				 (pppxyz)	;structure arg
				 `(aref ,var ,(incf counter)))))
	  parms)
;; return the make-struct for evaluation
  `(defun
     ,(intern (strcat 
	       (string  'make-) (string (car name))))		
     ()
     (prog (template result )
	   (setq template (quote ,parms))
	   (setq result (make-array (length template)))
	   (dotimes (i (length template))
		    (if (listp (nth i template))
			(setf (aref  result i)
			      (cadr (nth i template)))))
	   (return result))))


Robert Hamilton
Dept of Elect. Engin. 
Kings Buildings,
University of Edinburgh
JANET: ····@uk.ac.ed.ee