|
|
1.1 root 1: ;;;-*-lisp-*-
2: (setq rcs-strictini-
3: "$Header: /usr/lib/lisp/structini.l,v 1.1 83/01/29 18:40:11 jkf Exp $")
4:
5: #+franz
6: (declare (macros t))
7:
8: (defmacro defstruct ((name . opts) . slots)
9: (let ((dp (cadr (assq ':default-pointer opts)))
10: (conc-name (cadr (assq ':conc-name opts)))
11: (cons-name (implode (append '(m a k e -) (explodec name)))))
12: #Q (fset-carefully cons-name '(macro . initial_defstruct-cons))
13: #M (putprop cons-name 'initial_defstruct-cons 'macro)
14: #F (putd cons-name '(macro (x) (initial_defstruct-cons x)))
15: (do ((i 0 (1+ i))
16: (l slots (cdr l))
17: (foo nil (cons (list slot init) foo))
18: (chars (explodec conc-name))
19: (slot) (acsor) (init))
20: ((null l)
21: (putprop cons-name foo 'initial_defstruct-inits)
22: `',name)
23: (cond ((atom (car l))
24: (setq slot (car l))
25: (setq init nil))
26: (t (setq slot (caar l))
27: (setq init (cadar l))))
28: (setq acsor (implode (append chars (explodec slot))))
29: (putprop acsor dp 'initial_defstruct-dp)
30: #Q (fset-carefully acsor '(macro . initial_defstruct-ref))
31: #M (putprop acsor 'initial_defstruct-ref 'macro)
32: #F (putd acsor '(macro (x) (initial_defstruct-ref x)))
33: (putprop acsor i 'initial_defstruct-i))))
34:
35: (defun initial_defstruct-ref (form)
36: (let ((i (get (car form) 'initial_defstruct-i))
37: (p (if (null (cdr form))
38: (get (car form) 'initial_defstruct-dp)
39: (cadr form))))
40: #-Multics `(nth ,i ,p)
41: #+Multics `(car ,(do ((i i (1- i))
42: (x p `(cdr ,x)))
43: ((zerop i) x)))
44: ))
45:
46: (defun initial_defstruct-cons (form)
47: (do ((inits (get (car form) 'initial_defstruct-inits)
48: (cdr inits))
49: (gen (gensym))
50: (x nil (cons (or (get form (caar inits))
51: (cadar inits))
52: x)))
53: ((null inits)
54: `(list . ,x))))
55:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.