|
|
1.1 root 1: ;;
2: ;; charmac.l -[Sat Jan 29 18:13:40 1983 by jkf]-
3: ;;
4: ;; character macros
5: ;; this contains the definition of the backquote and sharpsign
6: ;; character macros. [the backquote macro also defines the comma macro]
7: ;;
8:
9: (setq rcs-charmac-
10: "$Header: /usr/lib/lisp/charmac.l,v 1.1 83/01/29 18:33:29 jkf Exp $")
11:
12:
13: (declare (macros t))
14:
15: (setq **backquote** 1)
16:
17: (declare (special **backquote** Backquote-comma Backquote-comma-at
18: Backquote-comma-dot))
19:
20: (setq Backquote-comma (gensym)
21: Backquote-comma-at (gensym)
22: Backquote-comma-dot (gensym))
23:
24: (def back-quote-ch-macro
25: (lambda nil
26: (back=quotify ((lambda (**backquote**) (read))
27: (1+ **backquote**)))))
28:
29: (def back-quote-comma-macro
30: (lambda nil
31: ((lambda (**backquote**)
32: (cond ((zerop **backquote**)
33: (error "comma not inside a backquote."))
34: ((eq (tyipeek) 64)
35: (tyi)
36: (cons Backquote-comma-at (read)))
37: ((eq (tyipeek) 46)
38: (tyi)
39: (cons Backquote-comma-dot (read)))
40: (t (cons Backquote-comma (read)))))
41: (1- **backquote**))))
42:
43: (def back=quotify
44: (lambda (x)
45: ((lambda (a d aa ad dqp)
46: (cond ((atom x) (list 'quote x))
47: ((eq (car x) Backquote-comma) (cdr x))
48: ((or (atom (car x))
49: (not (or (eq (caar x) Backquote-comma-at)
50: (eq (caar x) Backquote-comma-dot))))
51: (setq a (back=quotify (car x)) d (back=quotify (cdr x))
52: ad (atom d) aa (atom a)
53: dqp (and (not ad) (eq (car d) 'quote)))
54: (cond ((and dqp (not (atom a)) (eq (car a) 'quote))
55: (list 'quote (cons (cadr a) (cadr d))))
56: ((and dqp (null (cadr d)))
57: (list 'list a))
58: ((and (not ad) (eq (car d) 'list))
59: (cons 'list (cons a (cdr d))))
60: (t (list 'cons a d))))
61: ((eq (caar x) Backquote-comma-at)
62: (list 'append (cdar x) (back=quotify (cdr x))))
63: ((eq (caar x) Backquote-comma-dot)
64: (list 'nconc (cdar x)(back=quotify (cdr x))))
65: ))
66: nil nil nil nil nil)))
67:
68:
69: (setsyntax '\` 'macro 'back-quote-ch-macro)
70: (setsyntax '\, 'macro 'back-quote-comma-macro)
71:
72:
73: ;------- sharpsign macro, used for conditional assembly
74:
75: ;#O <SEXP> or #o <SEXP> reads sexp with ibase bound to 8.
76: ;#+<FEATURE> <SEXP> makes <SEXP> exist if (STATUS FEATURE <FEATURE>) is T
77: ;#-<FEATURE> <SEXP> makes <SEXP> exist if (STATUS FEATURE <FEATURE>) is NIL
78: ;#+(OR F1 F2 ...) <SEXP> makes <SEXP> exist of any one of F1,F2,... are in
79: ; the (STATUS FEATURES) list.
80: ;#+(AND F1 F2 ...) works similarly except all must be present in the list.
81: ;#+(NOT <FEATURE>) is the same as #-<FEATURE>.
82: ;#/CHAR returns the numerical character code of CHAR.
83: ;#\SYMBOL gets the numerical character code of non-printing characters.
84: ;#' is to FUNCTION as ' is to QUOTE.
85: ;#.<SEXP> evaluates <SEXP> at read time and leaves the result.
86: ;#,<SEXP> evaluates <SEXP> at load time. Here it is the same as "#.".
87: ;#t returns t, this means something in NIL, I am not sure what.
88:
89:
90: (declare (special sharpm-function-names franz-symbolic-character-names))
91: (setq sharpm-function-names nil)
92:
93: (def new-sharp-sign-macro
94: (lambda ()
95: ((lambda (char entry)
96: (cond ((setq entry (assq char sharpm-function-names))
97: (funcall (cdr entry) char))
98: (t (error "Unknown character after #:" (ascii char)))))
99: (tyi) nil)))
100:
101: (setsyntax '\# 'splicing 'new-sharp-sign-macro)
102:
103: ;--- defsharp :: define a sharp sign handler
104: ; form is (defsharp key arglist body ...)
105: ; where key is a number or a list of numbers (fixnum equivalents of chars)
106: ; arglist is a list of one argument, which will be bound to the fixnum
107: ; representation of the character typed.
108: ; body is the function to be executed when #key is seen. it should return
109: ; either nil or (list x) where x is what will be spliced in.
110: ;
111: (def defsharp
112: (macro (arg) ; arg is (defsharp number-or-list arglist function-body)
113: (prog (name)
114: (setq name (concat "Sharpm" (cond ((dtpr (cadr arg)) (caadr arg))
115: (t (cadr arg)))
116: (gensym)))
117: (cond ((dtpr (cadr arg))
118: (return `(progn 'compile
119: ,@(mapcar
120: '(lambda (x)
121: (defsharp-expand x name))
122: (cadr arg))
123: (defun ,name ,(caddr arg) ,@(cdddr arg)))))
124: (t (return `(progn 'compile
125: ,(defsharp-expand (cadr arg) name)
126: (defun ,name ,(caddr arg) ,@(cdddr arg)))))))))
127:
128: (eval-when (compile load eval)
129: (defun defsharp-expand (code name)
130: (cond ((symbolp code) (setq code (car (aexploden code)))))
131: `((lambda (current)
132: (cond ((setq current (assq ,code sharpm-function-names))
133: (rplacd current ',name))
134: (t (setq sharpm-function-names
135: (cons '(,code . ,name)
136: sharpm-function-names)))))
137: nil)))
138:
139:
140: ;; standard sharp sign functions:
141: (declare (special ibase))
142:
143: (defsharp (o O) (x) ((lambda (ibase) (list (read))) 8.)) ;#o #O
144: (defsharp (x X) (x) (do ((res 0) ;#x #X (hex)
145: (this (tyi) (tyi))
146: (firstch t nil)
147: (factor 1))
148: (nil)
149: (cond ((not (or (> this 57.) ; #/0 <= this <= #/9
150: (< this 48.)))
151: (setq res (+ (* res 16.) (- this 48.))))
152: ((not (or (> this 102.) ; #/a <= this <= #/f
153: (< this 97.)))
154: (setq res (+ (* res 16.) (- this (- 97 10)))))
155: ((not (or (> this 70.)
156: (< this 65.)))
157: (setq res (+ (* res 16.) (- this (- 65 10)))))
158: ((and firstch (eq this 43.))) ; #/+
159: ((and firstch (eq this 45.)) ; #/-
160: (setq factor (* -1 factor)))
161: (t (untyi this)
162: (return (list (* factor res)))))))
163:
164:
165:
166: (defsharp + (x) ((lambda (frob) ; #+
167: (cond ((not (feature-present frob)) (read)))
168: nil)
169: (read)))
170: (defsharp - (x) ((lambda (frob) ; #-
171: (cond ((feature-present frob) (read)))
172: nil)
173: (read)))
174: (defsharp / (x) (list (tyi))) ;#/ fixum equiv
175: (defsharp ^ (x) (list (boole 1 31. (tyi)))) ;#^ cntrl next char
176: (defsharp \' (x) (list (list 'function (read)))) ;#' function
177: (defsharp (\, \.) (x) (list (eval (read)))) ;#, or #.
178: (defsharp \\ (x) ((lambda (frob char) ;#\
179: (setq char
180: (cdr (assq frob franz-symbolic-character-names)))
181: (or char (error '|Illegal character name in #\\| frob))
182: (list char))
183: (read) nil))
184: (defsharp (t T) (x) (list t)) ;#t (for NIL)
185: (defsharp (M m Q q F f) (char) ;M m Q q F f
186: (cond ((not (feature-present
187: (cadr (assoc char '((77. maclisp) (109. maclisp)
188: (81. lispm) (113. lispm)
189: (70. franz) (102. franz))))))
190: (read)))
191: nil)
192:
193:
194: (defun feature-present (feature)
195: (cond ((atom feature)
196: (memq feature (status features))) ;damn fsubrs
197: ((eq (car feature) 'not)
198: (not (feature-present (cadr feature))))
199: ((eq (car feature) 'and)
200: (do ((list (cdr feature) (cdr list)))
201: ((null list) t)
202: (cond ((not (feature-present (car list)))
203: (return nil)))))
204: ((eq (car feature) 'or)
205: (do ((list (cdr feature) (cdr list)))
206: ((null list) nil)
207: (cond ((feature-present (car list))
208: (return t)))))
209: (t (error '|Unknown form after #+ or #-| feature))))
210:
211: (setq franz-symbolic-character-names
212: '((eof . -1) (backspace . 8.)(bs . 8.)
213: (tab . 9.) (lf . 10.) (linefeed . 10.)
214: (ff . 12.) (form . 12.) (return . 13.) (cr . 13.)
215: (newline . 10.) (vt . 11.)
216: (esc . 27.) (alt . 27.)
217: (space . 32.) (sp . 32.)
218: (dq . 34.) ; "
219: (lpar . 40.) (rpar . 41.)
220: (vert . 124.) ; |
221: (rubout . 127.)
222: ))
223:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.