|
|
1.1 root 1:
2:
3:
4:
5:
6:
7:
8: CHAPTER 7
9:
10:
11: The Lisp Reader
12:
13:
14:
15:
16:
17:
18: 7.1. Introduction
19:
20: The _r_e_a_d function is responsible for converting a
21: stream of characters into a Lisp expression. _R_e_a_d is
22: table driven and the table it uses is called a _r_e_a_d_t_-
23: _a_b_l_e. The _p_r_i_n_t function does the inverse of _r_e_a_d; it
24: converts a Lisp expression into a stream of charac-
25: ters. Typically the conversion is done in such a way
26: that if that stream of characters were read by _r_e_a_d,
27: the result would be an expression equal to the one
28: _p_r_i_n_t was given. _P_r_i_n_t must also refer to the readt-
29: able in order to determine how to format its output.
30: The _e_x_p_l_o_d_e function, which returns a list of charac-
31: ters rather than printing them, must also refer to
32: the readtable.
33:
34: A readtable is created with the _m_a_k_e_r_e_a_d_t_a_b_l_e
35: function, modified with the _s_e_t_s_y_n_t_a_x function and
36: interrogated with the _g_e_t_s_y_n_t_a_x function. The struc-
37: ture of a readtable is hidden from the user - a
38: readtable should only be manipulated with the three
39: functions mentioned above.
40:
41: There is one distinguished readtable called the
42: _c_u_r_r_e_n_t _r_e_a_d_t_a_b_l_e whose value determines what _r_e_a_d,
43: _p_r_i_n_t and _e_x_p_l_o_d_e do. The current readtable is the
44: value of the symbol _r_e_a_d_t_a_b_l_e. Thus it is possible
45: to rapidly change the current syntax by lambda binding
46: a different readtable to the symbol _r_e_a_d_t_a_b_l_e. When
47: the binding is undone, the syntax reverts to its old
48: form.
49:
50:
51:
52: 7.2. Syntax Classes
53:
54: The readtable describes how each of the 128 ascii
55: characters should be treated by the reader and
56: printer. Each character belongs to a _s_y_n_t_a_x _c_l_a_s_s
57: which has three properties:
58:
59: character class -
60: Tells what the reader should do when it sees this
61:
62:
63: The Lisp Reader 7-1
64:
65:
66:
67:
68:
69:
70:
71: The Lisp Reader 7-2
72:
73:
74: character. There are a large number of character
75: classes. They are described below.
76:
77: separator -
78: Most types of tokens the reader constructs are
79: one character long. Four token types have an
80: arbitrary length: number (1234), symbol print
81: name (franz), escaped symbol print name
82: (|franz|), and string ("franz"). The reader can
83: easily determine when it has come to the end of
84: one of the last two types: it just looks for the
85: matching delimiter (| or "). When the reader is
86: reading a number or symbol print name, it stops
87: reading when it comes to a character with the
88: _s_e_p_a_r_a_t_o_r property. The separator character is
89: pushed back into the input stream and will be the
90: first character read when the reader is called
91: again.
92:
93: escape -
94: Tells the printer when to put escapes in front
95: of, or around, a symbol whose print name contains
96: this character. There are three possibilities:
97: always escape a symbol with this character in it,
98: only escape a symbol if this is the only charac-
99: ter in the symbol, and only escape a symbol if
100: this is the first character in the symbol.
101: [note: The printer will always escape a symbol
102: which, if printed out, would look like a valid
103: number.]
104:
105: When the Lisp system is built, Lisp code is added
106: to a C-coded kernel and the result becomes the stan-
107: dard lisp system. The readtable present in the C-
108: coded kernel, called the _r_a_w _r_e_a_d_t_a_b_l_e, contains the
109: bare necessities for reading in Lisp code. During the
110: construction of the complete Lisp system, a copy is
111: made of the raw readtable and then the copy is modi-
112: fied by adding macro characters. The result is what
113: is called the _s_t_a_n_d_a_r_d _r_e_a_d_t_a_b_l_e. When a new readt-
114: able is created with _m_a_k_e_r_e_a_d_t_a_b_l_e, a copy is made of
115: either the raw readtable or the current readtable
116: (which is likely to be the standard readtable).
117:
118:
119:
120: 7.3. Reader Operations
121:
122: The reader has a very simple algorithm. It is
123: either _s_c_a_n_n_i_n_g for a token, _c_o_l_l_e_c_t_i_n_g a token, or
124: _p_r_o_c_e_s_s_i_n_g a token. Scanning involves reading charac-
125: ters and throwing away those which don't start tokens
126: (such as blanks and tabs). Collecting means gathering
127:
128:
129: Printed: January 31, 1984
130:
131:
132:
133:
134:
135:
136:
137: The Lisp Reader 7-3
138:
139:
140: the characters which make up a token into a buffer.
141: Processing may involve creating symbols, strings,
142: lists, fixnums, bignums or flonums or calling a user
143: written function called a character macro.
144:
145: The components of the syntax class determine when
146: the reader switches between the scanning, collecting
147: and processing states. The reader will continue scan-
148: ning as long as the character class of the characters
149: it reads is _c_s_e_p_a_r_a_t_o_r. When it reads a character
150: whose character class is not _c_s_e_p_a_r_a_t_o_r it stores that
151: character in its buffer and begins the collecting
152: phase.
153:
154: If the character class of that first character is
155: _c_c_h_a_r_a_c_t_e_r, _c_n_u_m_b_e_r, _c_p_e_r_i_o_d, or _c_s_i_g_n. then it will
156: continue collecting until it runs into a character
157: whose syntax class has the _s_e_p_a_r_a_t_o_r property. (That
158: last character will be pushed back into the input
159: buffer and will be the first character read next
160: time.) Now the reader goes into the processing phase,
161: checking to see if the token it read is a number or
162: symbol. It is important to note that after the first
163: character is collected the component of the syntax
164: class which tells the reader to stop collecting is
165: the _s_e_p_a_r_a_t_o_r property, not the character class.
166:
167: If the character class of the character which
168: stopped the scanning is not _c_c_h_a_r_a_c_t_e_r, _c_n_u_m_b_e_r,
169: _c_p_e_r_i_o_d, or _c_s_i_g_n. then the reader processes that
170: character immediately. The character classes
171: _c_s_i_n_g_l_e-_m_a_c_r_o, _c_s_i_n_g_l_e-_s_p_l_i_c_i_n_g-_m_a_c_r_o, and _c_s_i_n_g_l_e-
172: _i_n_f_i_x-_m_a_c_r_o will act like _c_c_h_a_r_a_c_t_e_r if the following
173: token is not a _s_e_p_a_r_a_t_o_r. The processing which is
174: done for a given character class is described in
175: detail in the next section.
176:
177:
178:
179: 7.4. Character Classes
180:
181:
182: _c_c_h_a_r_a_c_t_e_r raw readtable:A-Z a-z ^H !#$%&*,/:;<=>?@^_`{}~
183: standard readtable:A-Z a-z ^H !$%&*/:;<=>?@^_{}~
184: A normal character.
185:
186:
187: _c_n_u_m_b_e_r raw readtable:0-9
188: standard readtable:0-9
189: This type is a digit. The syntax for an integer (fix-
190: num or bignum) is a string of _c_n_u_m_b_e_r characters
191: optionally followed by a _c_p_e_r_i_o_d. If the digits are
192: not followed by a _c_p_e_r_i_o_d, then they are interpreted
193:
194:
195: Printed: January 31, 1984
196:
197:
198:
199:
200:
201:
202:
203: The Lisp Reader 7-4
204:
205:
206: in base _i_b_a_s_e which must be eight or ten. The syntax
207: for a floating point number is either zero or more
208: _c_n_u_m_b_e_r's followed by a _c_p_e_r_i_o_d and then followed by
209: one or more _c_n_u_m_b_e_r's. A floating point number may
210: also be an integer or floating point number followed
211: by 'e' or 'd', an optional '+' or '-' and then zero or
212: more _c_n_u_m_b_e_r's.
213:
214:
215: _c_s_i_g_n raw readtable:+-
216: standard readtable:+-
217: A leading sign for a number. No other characters
218: should be given this class.
219:
220:
221: _c_l_e_f_t_-_p_a_r_e_n raw readtable:(
222: standard readtable:(
223: A left parenthesis. Tells the reader to begin forming
224: a list.
225:
226:
227: _c_r_i_g_h_t_-_p_a_r_e_n raw readtable:)
228: standard readtable:)
229: A right parenthesis. Tells the reader that it has
230: reached the end of a list.
231:
232:
233: _c_l_e_f_t_-_b_r_a_c_k_e_t raw readtable:[
234: standard readtable:[
235: A left bracket. Tells the reader that it should begin
236: forming a list. See the description of _c_r_i_g_h_t-_b_r_a_c_k_e_t
237: for the difference between cleft-bracket and cleft-
238: paren.
239:
240:
241: _c_r_i_g_h_t_-_b_r_a_c_k_e_t raw readtable:]
242: standard readtable:]
243: A right bracket. A _c_r_i_g_h_t-_b_r_a_c_k_e_t finishes the forma-
244: tion of the current list and all enclosing lists until
245: it finds one which begins with a _c_l_e_f_t-_b_r_a_c_k_e_t or
246: until it reaches the top level list.
247:
248:
249: _c_p_e_r_i_o_d raw readtable:.
250: standard readtable:.
251: The period is used to separate element of a cons cell
252: [e.g. (a . (b . nil)) is the same as (a b)]. _c_p_e_r_i_o_d
253: is also used in numbers as described above.
254:
255:
256: _c_s_e_p_a_r_a_t_o_r raw readtable:^I-^M esc space
257: standard readtable:^I-^M esc space
258: Separates tokens. When the reader is scanning, these
259:
260:
261: Printed: January 31, 1984
262:
263:
264:
265:
266:
267:
268:
269: The Lisp Reader 7-5
270:
271:
272: character are passed over. Note: there is a differ-
273: ence between the _c_s_e_p_a_r_a_t_o_r character class and the
274: _s_e_p_a_r_a_t_o_r property of a syntax class.
275:
276:
277: _c_s_i_n_g_l_e_-_q_u_o_t_e raw readtable:'
278: standard readtable:'
279: This causes _r_e_a_d to be called recursively and the list
280: (quote <value read>) to be returned.
281:
282:
283: _c_s_y_m_b_o_l_-_d_e_l_i_m_i_t_e_r raw readtable:|
284: standard readtable:|
285: This causes the reader to begin collecting characters
286: and to stop only when another identical _c_s_y_m_b_o_l-
287: _d_e_l_i_m_i_t_e_r is seen. The only way to escape a _c_s_y_m_b_o_l-
288: _d_e_l_i_m_i_t_e_r within a symbol name is with a _c_e_s_c_a_p_e char-
289: acter. The collected characters are converted into a
290: string which becomes the print name of a symbol. If a
291: symbol with an identical print name already exists,
292: then the allocation is not done, rather the existing
293: symbol is used.
294:
295:
296: _c_e_s_c_a_p_e raw readtable:\
297: standard readtable:\
298: This causes the next character to read in to be
299: treated as a vcharacter. A character whose syntax
300: class is vcharacter has a character class _c_c_h_a_r_a_c_t_e_r
301: and does not have the _s_e_p_a_r_a_t_o_r property so it will
302: not separate symbols.
303:
304:
305: _c_s_t_r_i_n_g_-_d_e_l_i_m_i_t_e_r raw readtable:"
306: standard readtable:"
307: This is the same as _c_s_y_m_b_o_l-_d_e_l_i_m_i_t_e_r except the
308: result is returned as a string instead of a symbol.
309:
310:
311: _c_s_i_n_g_l_e_-_c_h_a_r_a_c_t_e_r_-_s_y_m_b_o_l raw readtable:none
312: standard readtable:none
313: This returns a symbol whose print name is the the sin-
314: gle character which has been collected.
315:
316:
317: _c_m_a_c_r_o raw readtable:none
318: standard readtable:`,
319: The reader calls the macro function associated with
320: this character and the current readtable, passing it
321: no arguments. The result of the macro is added to the
322: structure the reader is building, just as if that form
323: were directly read by the reader. More details on
324: macros are provided below.
325:
326:
327: Printed: January 31, 1984
328:
329:
330:
331:
332:
333:
334:
335: The Lisp Reader 7-6
336:
337:
338: _c_s_p_l_i_c_i_n_g_-_m_a_c_r_o raw readtable:none
339: standard readtable:#;
340: A _c_s_p_l_i_c_i_n_g-_m_a_c_r_o differs from a _c_m_a_c_r_o in the way the
341: result is incorporated in the structure the reader is
342: building. A _c_s_p_l_i_c_i_n_g-_m_a_c_r_o must return a list of
343: forms (possibly empty). The reader acts as if it read
344: each element of the list itself without the surround-
345: ing parenthesis.
346:
347:
348: _c_s_i_n_g_l_e_-_m_a_c_r_o raw readtable:none
349: standard readtable:none
350: This causes to reader to check the next character. If
351: it is a _c_s_e_p_a_r_a_t_o_r then this acts like a _c_m_a_c_r_o. Oth-
352: erwise, it acts like a _c_c_h_a_r_a_c_t_e_r.
353:
354:
355: _c_s_i_n_g_l_e_-_s_p_l_i_c_i_n_g_-_m_a_c_r_o raw readtable:none
356: standard readtable:none
357: This is triggered like a _c_s_i_n_g_l_e-_m_a_c_r_o however the
358: result is spliced in like a _c_s_p_l_i_c_i_n_g-_m_a_c_r_o.
359:
360:
361: _c_i_n_f_i_x_-_m_a_c_r_o raw readtable:none
362: standard readtable:none
363: This is differs from a _c_m_a_c_r_o in that the macro func-
364: tion is passed a form representing what the reader has
365: read so far. The result of the macro replaces what the
366: reader had read so far.
367:
368:
369: _c_s_i_n_g_l_e_-_i_n_f_i_x_-_m_a_c_r_o raw readtable:none
370: standard readtable:none
371: This differs from the _c_i_n_f_i_x-_m_a_c_r_o in that the macro
372: will only be triggered if the character following the
373: _c_s_i_n_g_l_e-_i_n_f_i_x-_m_a_c_r_o character is a _c_s_e_p_a_r_a_t_o_r.
374:
375:
376: _c_i_l_l_e_g_a_l raw readtable:^@-^G^N-^Z^\-^_rubout
377: standard readtable:^@-^G^N-^Z^\-^_rubout
378: The characters cause the reader to signal an error if
379: read.
380:
381:
382:
383: 7.5. Syntax Classes
384:
385: The readtable maps each character into a syntax
386: class. The syntax class contains three pieces of
387: information: the character class, whether this is a
388: separator, and the escape properties. The first two
389: properties are used by the reader, the last by the
390: printer (and _e_x_p_l_o_d_e). The initial lisp system has
391:
392:
393: Printed: January 31, 1984
394:
395:
396:
397:
398:
399:
400:
401: The Lisp Reader 7-7
402:
403:
404: the following syntax classes defined. The user may
405: add syntax classes with _a_d_d-_s_y_n_t_a_x-_c_l_a_s_s. For each
406: syntax class, we list the properties of the class and
407: which characters have this syntax class by default.
408: More information about each syntax class can be found
409: under the description of the syntax class's character
410: class.
411:
412: vcharacter raw readtable:A-Z a-z ^H !#$%&*,/:;<=>?@^_`{}~
413: _c_c_h_a_r_a_c_t_e_r standard readtable:A-Z a-z ^H !$%&*/:;<=>?@^_{}~
414:
415:
416:
417: vnumber raw readtable:0-9
418: _c_n_u_m_b_e_r standard readtable:0-9
419:
420:
421:
422: vsign raw readtable:+-
423: _c_s_i_g_n standard readtable:+-
424:
425:
426:
427: vleft-paren raw readtable:(
428: _c_l_e_f_t_-_p_a_r_e_n standard readtable:(
429: _e_s_c_a_p_e_-_a_l_w_a_y_s
430: _s_e_p_a_r_a_t_o_r
431:
432: vright-paren raw readtable:)
433: _c_r_i_g_h_t_-_p_a_r_e_n standard readtable:)
434: _e_s_c_a_p_e_-_a_l_w_a_y_s
435: _s_e_p_a_r_a_t_o_r
436:
437: vleft-bracket raw readtable:[
438: _c_l_e_f_t_-_b_r_a_c_k_e_t standard readtable:[
439: _e_s_c_a_p_e_-_a_l_w_a_y_s
440: _s_e_p_a_r_a_t_o_r
441:
442: vright-bracket raw readtable:]
443: _c_r_i_g_h_t_-_b_r_a_c_k_e_t standard readtable:]
444: _e_s_c_a_p_e_-_a_l_w_a_y_s
445: _s_e_p_a_r_a_t_o_r
446:
447: vperiod raw readtable:.
448: _c_p_e_r_i_o_d standard readtable:.
449: _e_s_c_a_p_e_-_w_h_e_n_-_u_n_i_q_u_e
450:
451:
452: vseparator raw readtable:^I-^M esc space
453: _c_s_e_p_a_r_a_t_o_r standard readtable:^I-^M esc space
454: _e_s_c_a_p_e_-_a_l_w_a_y_s
455: _s_e_p_a_r_a_t_o_r
456: 9
457:
458: 9 Printed: January 31, 1984
459:
460:
461:
462:
463:
464:
465:
466: The Lisp Reader 7-8
467:
468:
469: vsingle-quote raw readtable:'
470: _c_s_i_n_g_l_e_-_q_u_o_t_e standard readtable:'
471: _e_s_c_a_p_e_-_a_l_w_a_y_s
472: _s_e_p_a_r_a_t_o_r
473:
474: vsymbol-delimiter raw readtable:|
475: _c_s_i_n_g_l_e_-_d_e_l_i_m_i_t_e_r standard readtable:|
476: _e_s_c_a_p_e_-_a_l_w_a_y_s
477:
478:
479: vescape raw readtable:\
480: _c_e_s_c_a_p_e standard readtable:\
481: _e_s_c_a_p_e_-_a_l_w_a_y_s
482:
483:
484: vstring-delimiter raw readtable:"
485: _c_s_t_r_i_n_g_-_d_e_l_i_m_i_t_e_r standard readtable:"
486: _e_s_c_a_p_e_-_a_l_w_a_y_s
487:
488:
489: vsingle-character-symbol raw readtable:none
490: _c_s_i_n_g_l_e_-_c_h_a_r_a_c_t_e_r_-_s_y_m_b_o_l standard readtable:none
491: _s_e_p_a_r_a_t_o_r
492:
493:
494: vmacro raw readtable:none
495: _c_m_a_c_r_o standard readtable:`,
496: _e_s_c_a_p_e_-_a_l_w_a_y_s
497: _s_e_p_a_r_a_t_o_r
498:
499: vsplicing-macro raw readtable:none
500: _c_s_p_l_i_c_i_n_g_-_m_a_c_r_o standard readtable:#;
501: _e_s_c_a_p_e_-_a_l_w_a_y_s
502: _s_e_p_a_r_a_t_o_r
503:
504: vsingle-macro raw readtable:none
505: _c_s_i_n_g_l_e_-_m_a_c_r_o standard readtable:none
506: _e_s_c_a_p_e_-_w_h_e_n_-_u_n_i_q_u_e
507:
508:
509: vsingle-splicing-macro raw readtable:none
510: _c_s_i_n_g_l_e_-_s_p_l_i_c_i_n_g_-_m_a_c_r_o standard readtable:none
511: _e_s_c_a_p_e_-_w_h_e_n_-_u_n_i_q_u_e
512:
513:
514: vinfix-macro raw readtable:none
515: _c_i_n_f_i_x_-_m_a_c_r_o standard readtable:none
516: _e_s_c_a_p_e_-_a_l_w_a_y_s
517: _s_e_p_a_r_a_t_o_r
518:
519: vsingle-infix-macro raw readtable:none
520: _c_s_i_n_g_l_e_-_i_n_f_i_x_-_m_a_c_r_o standard readtable:none
521: _e_s_c_a_p_e_-_w_h_e_n_-_u_n_i_q_u_e
522:
523:
524: Printed: January 31, 1984
525:
526:
527:
528:
529:
530:
531:
532: The Lisp Reader 7-9
533:
534:
535:
536:
537: villegal raw readtable:^@-^G^N-^Z^\-^_rubout
538: _c_i_l_l_e_g_a_l standard readtable:^@-^G^N-^Z^\-^_rubout
539: _e_s_c_a_p_e_-_a_l_w_a_y_s
540: _s_e_p_a_r_a_t_o_r
541:
542:
543:
544: 7.6. Character Macros
545:
546: Character macros are user written functions which
547: are executed during the reading process. The value
548: returned by a character macro may or may not be used
549: by the reader, depending on the type of macro and the
550: value returned. Character macros are always attached
551: to a single character with the _s_e_t_s_y_n_t_a_x function.
552:
553:
554:
555: 7.6.1. Types There are three types of character
556: macros: normal, splicing and infix. These types
557: differ in the arguments they are given or in what
558: is done with the result they return.
559:
560:
561:
562: 7.6.1.1. Normal
563:
564: A normal macro is passed no arguments. The
565: value returned by a normal macro is simply used
566: by the reader as if it had read the value
567: itself. Here is an example of a macro which
568: returns the abbreviation for a given state.
569:
570:
571: ____________________________________________________
572:
573: ->(_d_e_f_u_n _s_t_a_t_e_a_b_b_r_e_v _n_i_l
574: (_c_d_r (_a_s_s_q (_r_e_a_d) '((_c_a_l_i_f_o_r_n_i_a . _c_a) (_p_e_n_n_s_y_l_v_a_n_i_a . _p_a)))))
575: stateabbrev
576: -> (_s_e_t_s_y_n_t_a_x '_\! '_v_m_a_c_r_o '_s_t_a_t_e_a_b_b_r_e_v)
577: t
578: -> '( ! _c_a_l_i_f_o_r_n_i_a ! _w_y_o_m_i_n_g ! _p_e_n_n_s_y_l_v_a_n_i_a)
579: (ca nil pa)
580: ____________________________________________________
581:
582:
583:
584: Notice what happened to
585: ! _w_y_o_m_i_n_g. Since it wasn't in the table, the associated
586: function returned nil. The creator of the macro may have
587: wanted to leave the list alone, in such a case, but couldn't
588:
589:
590: Printed: January 31, 1984
591:
592:
593:
594:
595:
596:
597:
598: The Lisp Reader 7-10
599:
600:
601: with this type of reader macro. The splicing macro,
602: described next, allows a character macro function to return
603: a value that is ignored.
604:
605:
606:
607: 7.6.1.2. Splicing
608:
609: The value returned from a splicing macro
610: must be a list or nil. If the value is nil,
611: then the value is ignored, otherwise the reader
612: acts as if it read each object in the list.
613: Usually the list only contains one element. If
614: the reader is reading at the top level (i.e. not
615: collecting elements of list), then it is illegal
616: for a splicing macro to return more then one
617: element in the list. The major advantage of a
618: splicing macro over a normal macro is the abil-
619: ity of the splicing macro to return nothing. The
620: comment character (usually ;) is a splicing
621: macro bound to a function which reads to the end
622: of the line and always returns nil. Here is the
623: previous example written as a splicing macro
624:
625:
626: ____________________________________________________
627:
628: -> (_d_e_f_u_n _s_t_a_t_e_a_b_b_r_e_v _n_i_l
629: ((_l_a_m_b_d_a (_v_a_l_u_e)
630: (_c_o_n_d (_v_a_l_u_e (_l_i_s_t _v_a_l_u_e))
631: (_t _n_i_l)))
632: (_c_d_r (_a_s_s_q (_r_e_a_d) '((_c_a_l_i_f_o_r_n_i_a . _c_a) (_p_e_n_n_s_y_l_v_a_n_i_a . _p_a))))))
633: -> (_s_e_t_s_y_n_t_a_x '! '_v_s_p_l_i_c_i_n_g-_m_a_c_r_o '_s_t_a_t_e_a_b_b_r_e_v)
634: -> '(!_p_e_n_n_s_y_l_v_a_n_i_a ! _f_o_o !_c_a_l_i_f_o_r_n_i_a)
635: (pa ca)
636: -> '!_f_o_o !_b_a_r !_p_e_n_n_s_y_l_v_a_n_i_a
637: pa
638: ->
639: ____________________________________________________
640:
641:
642:
643:
644:
645:
646: 7.6.1.3. Infix
647:
648: Infix macros are passed a _c_o_n_c structure
649: representing what has been read so far.
650: Briefly, a tconc structure is a single list cell
651: whose car points to a list and whose cdr points
652: to the last list cell in that list. The
653: interpretation by the reader of the value
654:
655:
656: Printed: January 31, 1984
657:
658:
659:
660:
661:
662:
663:
664: The Lisp Reader 7-11
665:
666:
667: returned by an infix macro depends on whether
668: the macro is called while the reader is con-
669: structing a list or whether it is called at the
670: top level of the reader. If the macro is called
671: while a list is being constructed, then the
672: value returned should be a tconc structure.
673: The car of that structure replaces the list of
674: elements that the reader has been collecting.
675: If the macro is called at top level, then it
676: will be passed the value nil, and the value it
677: returns should either be nil or a tconc struc-
678: ture. If the macro returns nil, then the value
679: is ignored and the reader continues to read. If
680: the macro returns a tconc structure of one ele-
681: ment (i.e. whose car is a list of one element),
682: then that single element is returned as the
683: value of _r_e_a_d. If the macro returns a tconc
684: structure of more than one element, then that
685: list of elements is returned as the value of
686: read.
687:
688:
689: ____________________________________________________
690:
691: -> (_d_e_f_u_n _p_l_u_s_o_p (_x)
692: (_c_o_n_d ((_n_u_l_l _x) (_t_c_o_n_c _n_i_l '_\+))
693: (_t (_l_c_o_n_c _n_i_l (_l_i_s_t '_p_l_u_s (_c_a_a_r _x) (_r_e_a_d))))))
694:
695: plusop
696: -> (_s_e_t_s_y_n_t_a_x '_\+ '_v_i_n_f_i_x-_m_a_c_r_o '_p_l_u_s_o_p)
697: t
698: -> '(_a + _b)
699: (plus a b)
700: -> '+
701: |+|
702: ->
703: ____________________________________________________
704:
705:
706:
707:
708:
709:
710: 7.6.2. Invocations
711:
712: There are three different circumstances in
713: which you would like a macro function to be trig-
714: gered.
715:
716: _A_l_w_a_y_s -
717: Whenever the macro character is seen, the
718: macro should be invoked. This is accomplished
719: by using the character classes _c_m_a_c_r_o,
720:
721:
722: Printed: January 31, 1984
723:
724:
725:
726:
727:
728:
729:
730: The Lisp Reader 7-12
731:
732:
733: _c_s_p_l_i_c_i_n_g-_m_a_c_r_o, or _c_i_n_f_i_x-_m_a_c_r_o, and by using
734: the _s_e_p_a_r_a_t_o_r property. The syntax classes
735: vmacro, vsplicing-macro, and vsingle-macro are
736: defined this way.
737:
738: _W_h_e_n _f_i_r_s_t -
739: The macro should only be triggered when the
740: macro character is the first character found
741: after the scanning process. A syntax class
742: for a _w_h_e_n _f_i_r_s_t macro would be defined using
743: _c_m_a_c_r_o, _c_s_p_l_i_c_i_n_g-_m_a_c_r_o, or _c_i_n_f_i_x-_m_a_c_r_o and
744: not including the _s_e_p_a_r_a_t_o_r property.
745:
746: _W_h_e_n _u_n_i_q_u_e -
747: The macro should only be triggered when the
748: macro character is the only character col-
749: lected in the token collection phase of the
750: reader, i.e the macro character is preceeded
751: by zero or more _c_s_e_p_a_r_a_t_o_rs and followed by a
752: _s_e_p_a_r_a_t_o_r. A syntax class for a _w_h_e_n _u_n_i_q_u_e
753: macro would be defined using _c_s_i_n_g_l_e-_m_a_c_r_o,
754: _c_s_i_n_g_l_e-_s_p_l_i_c_i_n_g-_m_a_c_r_o, or _c_s_i_n_g_l_e-_i_n_f_i_x-_m_a_c_r_o
755: and not including the _s_e_p_a_r_a_t_o_r property. The
756: syntax classes so defined are vsingle-macro,
757: vsingle-splicing-macro, and vsingle-infix-
758: macro.
759:
760:
761:
762: 7.7. Functions
763:
764: (setsyntax 's_symbol 's_synclass ['ls_func])
765:
766: WHERE: ls_func is the name of a function or a lambda
767: body.
768:
769: RETURNS: t
770:
771: SIDE EFFECT: S_symbol should be a symbol whose print
772: name is only one character. The syntax
773: class for that character is set to
774: s_synclass in the current readtable. If
775: s_synclass is a class that requires a
776: character macro, then ls_func must be sup-
777: plied.
778:
779: NOTE: The symbolic syntax codes are new to Opus 38.
780: For compatibility, s_synclass can be one of the
781: fixnum syntax codes which appeared in older ver-
782: sions of the FRANZ LISP Manual. This compatibil-
783: ity is only temporary: existing code which uses
784: the fixnum syntax codes should be converted.
785: 9
786:
787: 9 Printed: January 31, 1984
788:
789:
790:
791:
792:
793:
794:
795: The Lisp Reader 7-13
796:
797:
798: (getsyntax 's_symbol)
799:
800: RETURNS: the syntax class of the first character of
801: s_symbol's print name. s_symbol's print name
802: must be exactly one character long.
803:
804: NOTE: This function is new to Opus 38. It supercedes
805: (_s_t_a_t_u_s _s_y_n_t_a_x) which no longer exists.
806:
807: (add-syntax-class 's_synclass 'l_properties)
808:
809: RETURNS: s_synclass
810:
811: SIDE EFFECT: Defines the syntax class s_synclass to
812: have properties l_properties. The list
813: l_properties should contain a character
814: classes mentioned above. l_properties may
815: contain one of the escape properties:
816: _e_s_c_a_p_e-_a_l_w_a_y_s, _e_s_c_a_p_e-_w_h_e_n-_u_n_i_q_u_e, or
817: _e_s_c_a_p_e-_w_h_e_n-_f_i_r_s_t. l_properties may con-
818: tain the _s_e_p_a_r_a_t_o_r property. After a syn-
819: tax class has been defined with _a_d_d-
820: _s_y_n_t_a_x-_c_l_a_s_s, the _s_e_t_s_y_n_t_a_x function can
821: be used to give characters that syntax
822: class.
823:
824:
825: ____________________________________________________
826:
827: ; Define a non-separating macro character.
828: ; This type of macro character is used in UCI-Lisp, and
829: ; it corresponds to a FIRST MACRO in Interlisp
830: -> (_a_d_d-_s_y_n_t_a_x-_c_l_a_s_s '_v_u_c_i-_m_a_c_r_o '(_c_m_a_c_r_o _e_s_c_a_p_e-_w_h_e_n-_f_i_r_s_t))
831: vuci-macro
832: ->
833: ____________________________________________________
834:
835:
836:
837:
838:
839:
840:
841:
842:
843:
844:
845:
846:
847:
848:
849:
850: 9
851:
852: 9 Printed: January 31, 1984
853:
854:
855:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.