struct.initial 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  1. ;;;-*-lisp-*-
  2. (defmacro defstruct ((name . opts) . slots)
  3. (let ((dp (cadr (assq 'default-pointer opts)))
  4. (conc-name (cadr (assq 'conc-name opts)))
  5. (cons-name (implode (append '(m a k e -) (explodec name)))))
  6. ; #Q (fset-carefully cons-name '(macro . initial_defstruct-cons))
  7. ; #M (putprop cons-name 'initial_defstruct-cons 'macro)
  8. ; PSL change
  9. (putd cons-name 'macro (cdr (getd 'initial_defstruct-cons)))
  10. ; PSL change 1+ ==> add1
  11. (do ((i 0 (add1 i))
  12. (l slots (cdr l))
  13. (foo nil (cons (list slot init) foo))
  14. (chars (explodec conc-name))
  15. (slot) (acsor) (init))
  16. ((null l)
  17. (putprop cons-name foo 'initial_defstruct-inits)
  18. `',name)
  19. (cond ((atom (car l))
  20. (setq slot (car l))
  21. (setq init nil))
  22. (t (setq slot (caar l))
  23. (setq init (cadar l))))
  24. (setq acsor (implode (append chars (explodec slot))))
  25. (putprop acsor dp 'initial_defstruct-dp)
  26. ; #Q (fset-carefully acsor '(macro . initial_defstruct-ref))
  27. ; #M (putprop acsor 'initial_defstruct-ref 'macro)
  28. ; PSL change
  29. (putd acsor 'macro (cdr (getd 'initial_defstruct-ref)))
  30. (putprop acsor i 'initial_defstruct-i))))
  31. (defun initial_defstruct-ref (form)
  32. (let ((i (get (car form) 'initial_defstruct-i))
  33. (p (if (null (cdr form))
  34. (get (car form) 'initial_defstruct-dp)
  35. (cadr form))))
  36. ; PSL change incompatible NTH
  37. #-Multics `(nth ,p ,(add1 i))
  38. ; #-Multics `(nth ,i ,p)
  39. #+Multics `(car ,(do ((i i (1- i))
  40. (x p `(cdr ,x)))
  41. ((zerop i) x)))
  42. ))
  43. (defun initial_defstruct-cons (form)
  44. (do ((inits (get (car form) 'initial_defstruct-inits)
  45. (cdr inits))
  46. (gen (gensym))
  47. (x nil (cons (or (get form (caar inits))
  48. (cadar inits))
  49. x)))
  50. ((null inits)
  51. `(list . ,x))))