Commit | Line | Data |
---|---|---|
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: |