BSD 4_4 development
[unix-history] / usr / src / old / lisp / pearl / symord.l
CommitLineData
6cbecd82
C
1;;;;;;;;;;;;;;;;;;;;;;;;;;;;; symord.l ;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2; Functions for defining symbols and ordinal types.
3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
4; Copyright (c) 1983 , The Regents of the University of California.
5; All rights reserved.
6; Authors: Joseph Faletti and Michael Deering.
7
8; Define one SYMBOL in a hunk for easy identification.
9; This will not work independently (for some reason).
10(dm onesymbol (none)
11 '(funl (symname)
12 (or (and (not (litatom symname))
13 (not (msg t "SYMBOL: Symbols can only be simple names, not:"
14 symname t)))
15 (and (eq symname 'nilsym)
16 (boundp (symatom 'nilsym))
17 (not (msg t "SYMBOL: Cannot redefine nilsym." t)))
18 (and (null symname)
19 (not (msg t "SYMBOL: Cannot name a symbol nil." t)))
20 (and (symbolnamep symname)
21 ; but okay to do.
22 (and *warn*
23 (msg t "SYMBOL: Warning: Redefining symbol: "
24 symname t)))
25 (let ((block (set (symatom symname) (makhunk 3))))
26 (putuniquenum (newnum) block)
27 (puttypetag '*pearlsymbol* block)
28 (putsymbolpname symname block)
29 block))))
30
31; Define a bunch of SYMBOLS.
32(df symbol (l)
33 (mapcar (onesymbol) l))
34
35; An EXPR which allows the defining of one SYMBOL.
36(de symbole (symname)
37 (cond ((not (litatom symname))
38 (msg t "SYMBOLE: symbols can only be simple names, not: "
39 symname t)
40 (pearlbreak))
41 ( t (apply* (onesymbol) (ncons symname)) symname)))
42
43(de getsymbol (symname)
44 (cond ((symbolnamep symname)
45 (eval (symatom symname)))
46 ( t (msg t "GETSYMBOL: " symname " is not the name of a symbol." t)
47 (pearlbreak))))
48
49; (ordinal name (x y z)) or (ordinal name (x 1 y 3 z 8)).
50; Define a set of integer constants for readability in input and output.
51; Also define o:name, name:max and name:min, and name:x, name:y and name:z.
52(df ordinal (l)
53 (let ((ordinalname (car l))
54 (ordinalelements (cadr l))
55 (alist (ncons nil))
56 (count 0)
57 (min 0)
58 max
59 name
60 value)
61 (push ordinalname *ordinalnames*)
62 (set (ordatom ordinalname)
63 (cond ((not (numberp (cadr ordinalelements)))
64 ; generate numbers.
65 (while ordinalelements
66 (setq count (1+ count))
67 (tconc alist (cons (setq name (pop ordinalelements))
68 count))
69 (set (concat ordinalname ":" name) count))
70 (or (\=& 0 count)
71 (setq min 1))
72 (setq max count)
73 (car alist))
74 ; use numbers provided by user.
75 ( t (setq min (setq max (cadr ordinalelements)))
76 (while ordinalelements
77 (tconc alist
78 (cons (setq name (pop ordinalelements))
79 (setq value (pop ordinalelements))))
80 (set (concat ordinalname ":" name) value)
81 (and (<& value min)
82 (setq min value))
83 (and (>& value max)
84 (setq max value)))
85 (car alist))))
86 (set (concat ordinalname ":min") min)
87 (set (concat ordinalname ":max") max)
88 (cons ordinalname (car alist))))
89
90
91; vi: set lisp: