1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456 |
- @node Reader, System Construction, Printer, Top
- @chapter Reader
- @menu
- * Reader Concepts::
- * Reader Dictionary::
- @end menu
- @node Reader Concepts, Reader Dictionary, Reader, Reader
- @section Reader Concepts
- @c including concept-reader
- @menu
- * Dynamic Control of the Lisp Reader::
- * Effect of Readtable Case on the Lisp Reader::
- * Argument Conventions of Some Reader Functions::
- @end menu
- @node Dynamic Control of the Lisp Reader, Effect of Readtable Case on the Lisp Reader, Reader Concepts, Reader Concepts
- @subsection Dynamic Control of the Lisp Reader
- Various aspects of the @i{Lisp reader} can be controlled dynamically.
- See @ref{Readtables} and @ref{Variables that affect the Lisp Reader}.
- @node Effect of Readtable Case on the Lisp Reader, Argument Conventions of Some Reader Functions, Dynamic Control of the Lisp Reader, Reader Concepts
- @subsection Effect of Readtable Case on the Lisp Reader
- The @i{readtable case} of the @i{current readtable} affects the @i{Lisp reader}
- in the following ways:
- @table @asis
- @item @t{:upcase}
- When the @i{readtable case} is @t{:upcase},
- unescaped constituent @i{characters} are converted to @i{uppercase},
- as specified in @ref{Reader Algorithm}.
- @item @t{:downcase}
- When the @i{readtable case} is @t{:downcase},
- unescaped constituent @i{characters} are converted to @i{lowercase}.
- @item @t{:preserve}
- When the @i{readtable case} is @t{:preserve},
- the case of all @i{characters} remains unchanged.
- @item @t{:invert}
- When the @i{readtable case} is @t{:invert},
- then if all of the unescaped letters in the extended token are of the same @i{case},
- those (unescaped) letters are converted to the opposite @i{case}.
- @end table
- @menu
- * Examples of Effect of Readtable Case on the Lisp Reader::
- @end menu
- @node Examples of Effect of Readtable Case on the Lisp Reader, , Effect of Readtable Case on the Lisp Reader, Effect of Readtable Case on the Lisp Reader
- @subsubsection Examples of Effect of Readtable Case on the Lisp Reader
- @example
- (defun test-readtable-case-reading ()
- (let ((*readtable* (copy-readtable nil)))
- (format t "READTABLE-CASE Input Symbol-name~
- ~
- ~
- (dolist (readtable-case '(:upcase :downcase :preserve :invert))
- (setf (readtable-case *readtable*) readtable-case)
- (dolist (input '("ZEBRA" "Zebra" "zebra"))
- (format t "~&:~A~16T~A~24T~A"
- (string-upcase readtable-case)
- input
- (symbol-name (read-from-string input)))))))
- @end example
- The output from @t{(test-readtable-case-reading)} should be as follows:
- @example
- READTABLE-CASE Input Symbol-name
- -------------------------------------
- :UPCASE ZEBRA ZEBRA
- :UPCASE Zebra ZEBRA
- :UPCASE zebra ZEBRA
- :DOWNCASE ZEBRA zebra
- :DOWNCASE Zebra zebra
- :DOWNCASE zebra zebra
- :PRESERVE ZEBRA ZEBRA
- :PRESERVE Zebra Zebra
- :PRESERVE zebra zebra
- :INVERT ZEBRA zebra
- :INVERT Zebra Zebra
- :INVERT zebra ZEBRA
- @end example
- @node Argument Conventions of Some Reader Functions, , Effect of Readtable Case on the Lisp Reader, Reader Concepts
- @subsection Argument Conventions of Some Reader Functions
- @menu
- * The EOF-ERROR-P argument::
- * The RECURSIVE-P argument::
- @end menu
- @node The EOF-ERROR-P argument, The RECURSIVE-P argument, Argument Conventions of Some Reader Functions, Argument Conventions of Some Reader Functions
- @subsubsection The EOF-ERROR-P argument
- @i{Eof-error-p} in input function calls
- controls what happens if input is from a file (or any other
- input source that has a definite end) and the end of the file is reached.
- If @i{eof-error-p} is @i{true} (the default),
- an error of @i{type} @b{end-of-file} is signaled
- at end of file. If it is @i{false}, then no error is signaled, and instead
- the function returns @i{eof-value}.
- Functions such as @b{read} that read the representation
- of an @i{object} rather than a single
- character always signals an error, regardless of @i{eof-error-p}, if
- the file ends in the middle of an object representation.
- For example, if a file does
- not contain enough right parentheses to balance the left parentheses in
- it, @b{read} signals an error. If a file ends in a
- @i{symbol} or a @i{number}
- immediately followed by end-of-file, @b{read} reads the
- @i{symbol} or
- @i{number}
- successfully and when called again will
- act according to @i{eof-error-p}.
- Similarly, the @i{function} @b{read-line}
- successfully reads the last line of a file even if that line
- is terminated by end-of-file rather than the newline character.
- Ignorable text, such as lines containing only @i{whitespace}_2 or comments,
- are not considered to begin an @i{object};
- if @b{read} begins to read an @i{expression} but sees only such
- ignorable text, it does not consider the file to end in the middle of an @i{object}.
- Thus an @i{eof-error-p} argument controls what happens
- when the file ends between @i{objects}.
- @node The RECURSIVE-P argument, , The EOF-ERROR-P argument, Argument Conventions of Some Reader Functions
- @subsubsection The RECURSIVE-P argument
- If @i{recursive-p} is supplied and not @b{nil}, it specifies that
- this function call is not an outermost call to @b{read} but an
- embedded call, typically from a @i{reader macro function}.
- It is important to distinguish such recursive calls for three reasons.
- @table @asis
- @item 1.
- An outermost call establishes the context within which the
- @t{#@i{n}=} and @t{#@i{n}#} syntax is scoped. Consider, for example,
- the expression
- @example
- (cons '#3=(p q r) '(x y . #3#))
- @end example
- If the @i{single-quote} @i{reader macro} were defined in this way:
- @example
- (set-macro-character #\' ;incorrect
- #'(lambda (stream char)
- (declare (ignore char))
- (list 'quote (read stream))))
- @end example
- then each call to the @i{single-quote} @i{reader macro function} would establish
- independent contexts for the scope of @b{read} information, including the scope of
- identifications between markers like ``@t{#3=}'' and ``@t{#3#}''. However, for
- this expression, the scope was clearly intended to be determined by the outer set
- of parentheses, so such a definition would be incorrect.
- The correct way to define the @i{single-quote}
- @i{reader macro} uses @i{recursive-p}:
- @example
- (set-macro-character #\' ;correct
- #'(lambda (stream char)
- (declare (ignore char))
- (list 'quote (read stream t nil t))))
- @end example
- @item 2.
- A recursive call does not alter whether the reading process
- is to preserve @i{whitespace}_2 or not (as determined by whether the
- outermost call was to @b{read} or @b{read-preserving-whitespace}).
- Suppose again that @i{single-quote}
- were to be defined as shown above in the incorrect definition.
- Then a call to @b{read-preserving-whitespace}
- that read the expression @t{'foo<@i{Space}>} would fail to preserve the space
- character following the symbol @t{foo} because the @i{single-quote}
- @i{reader macro function} calls @b{read},
- not @b{read-preserving-whitespace},
- to read the following expression (in this case @t{foo}).
- The correct definition, which passes the value @i{true} for @i{recursive-p}
- to @b{read}, allows the outermost call to determine
- whether @i{whitespace}_2 is preserved.
- @item 3.
- When end-of-file is encountered and the @i{eof-error-p} argument
- is not @b{nil}, the kind of error that is signaled may depend on the value
- of @i{recursive-p}. If @i{recursive-p}
- is @i{true}, then the end-of-file
- is deemed to have occurred within the middle of a printed representation;
- if @i{recursive-p} is @i{false}, then the end-of-file may be deemed to have
- occurred between @i{objects} rather than within the middle of one.
- @end table
- @c end of including concept-reader
- @node Reader Dictionary, , Reader Concepts, Reader
- @section Reader Dictionary
- @c including dict-reader
- @menu
- * readtable::
- * copy-readtable::
- * make-dispatch-macro-character::
- * read::
- * read-delimited-list::
- * read-from-string::
- * readtable-case::
- * readtablep::
- * set-dispatch-macro-character::
- * set-macro-character::
- * set-syntax-from-char::
- * with-standard-io-syntax::
- * *read-base*::
- * *read-default-float-format*::
- * *read-eval*::
- * *read-suppress*::
- * *readtable*::
- * reader-error::
- @end menu
- @node readtable, copy-readtable, Reader Dictionary, Reader Dictionary
- @subsection readtable [System Class]
- @subsubheading Class Precedence List::
- @b{readtable},
- @b{t}
- @subsubheading Description::
- A @i{readtable} maps @i{characters} into @i{syntax types} for
- the @i{Lisp reader}; see @ref{Syntax}.
- A @i{readtable} also
- contains associations between @i{macro characters}
- and their @i{reader macro functions},
- and records information about the case conversion rules
- to be used by the @i{Lisp reader} when parsing @i{symbols}.
- Each @i{simple} @i{character} must be representable in the @i{readtable}.
- It is @i{implementation-defined} whether @i{non-simple} @i{characters}
- can have syntax descriptions in the @i{readtable}.
- @subsubheading See Also::
- @ref{Readtables},
- @ref{Printing Other Objects}
- @node copy-readtable, make-dispatch-macro-character, readtable, Reader Dictionary
- @subsection copy-readtable [Function]
- @code{copy-readtable} @i{{&optional} from-readtable to-readtable} @result{} @i{readtable}
- @subsubheading Arguments and Values::
- @i{from-readtable}---a @i{readtable designator}.
- The default is the @i{current readtable}.
- @i{to-readtable}---a @i{readtable} or @b{nil}.
- The default is @b{nil}.
- @i{readtable}---the @i{to-readtable} if it is @i{non-nil},
- or else a @i{fresh} @i{readtable}.
- @subsubheading Description::
- @b{copy-readtable} copies @i{from-readtable}.
- If @i{to-readtable} is @b{nil}, a new @i{readtable} is created and returned.
- Otherwise the @i{readtable} specified by @i{to-readtable} is modified and returned.
- @b{copy-readtable} copies the setting of @b{readtable-case}.
- @subsubheading Examples::
- @example
- (setq zvar 123) @result{} 123
- (set-syntax-from-char #\z #\' (setq table2 (copy-readtable))) @result{} T
- zvar @result{} 123
- (copy-readtable table2 *readtable*) @result{} #<READTABLE 614000277>
- zvar @result{} VAR
- (setq *readtable* (copy-readtable)) @result{} #<READTABLE 46210223>
- zvar @result{} VAR
- (setq *readtable* (copy-readtable nil)) @result{} #<READTABLE 46302670>
- zvar @result{} 123
- @end example
- @subsubheading See Also::
- @b{readtable},
- @ref{readtable}
- @subsubheading Notes::
- @example
- (setq *readtable* (copy-readtable nil))
- @end example
- restores the input syntax to standard @r{Common Lisp} syntax, even if
- the @i{initial readtable} has been clobbered
- (assuming it is not so badly clobbered that you cannot type in the above expression).
- On the other hand,
- @example
- (setq *readtable* (copy-readtable))
- @end example
- replaces the current @i{readtable} with a copy of itself.
- This is useful if you want to save a copy of a readtable for later use,
- protected from alteration in the meantime. It is also useful if you want to
- locally bind the readtable to a copy of itself, as in:
- @example
- (let ((*readtable* (copy-readtable))) ...)
- @end example
- @node make-dispatch-macro-character, read, copy-readtable, Reader Dictionary
- @subsection make-dispatch-macro-character [Function]
- @code{make-dispatch-macro-character} @i{char {&optional} non-terminating-p readtable} @result{} @i{@b{t}}
- @subsubheading Arguments and Values::
- @i{char}---a @i{character}.
- @i{non-terminating-p}---a @i{generalized boolean}.
- The default is @i{false}.
- @i{readtable}---a @i{readtable}.
- The default is the @i{current readtable}.
- @subsubheading Description::
- @b{make-dispatch-macro-character} makes @i{char}
- be a @i{dispatching macro character} in @i{readtable}.
- Initially, every @i{character} in the dispatch table
- associated with the @i{char} has an associated function
- that signals an error of @i{type} @b{reader-error}.
- If @i{non-terminating-p} is @i{true},
- the @i{dispatching macro character}
- is made a @i{non-terminating} @i{macro character};
- if @i{non-terminating-p} is @i{false},
- the @i{dispatching macro character}
- is made a @i{terminating} @i{macro character}.
- @subsubheading Examples::
- @example
- (get-macro-character #\@{) @result{} NIL, @i{false}
- (make-dispatch-macro-character #\@{) @result{} T
- (not (get-macro-character #\@{)) @result{} @i{false}
- @end example
- The @i{readtable} is altered.
- @subsubheading See Also::
- @ref{readtable}
- ,
- @ref{set-dispatch-macro-character; get-dispatch-macro-character}
- @node read, read-delimited-list, make-dispatch-macro-character, Reader Dictionary
- @subsection read, read-preserving-whitespace [Function]
- @code{read} @i{{&optional} input-stream eof-error-p eof-value recursive-p} @result{} @i{object}
- @code{read-preserving-whitespace} @i{{&optional} input-stream eof-error-p
- eof-value recursive-p}@*
- @result{} @i{object}
- @subsubheading Arguments and Values::
- @i{input-stream}---an @i{input} @i{stream designator}.
- @i{eof-error-p}---a @i{generalized boolean}.
- The default is @i{true}.
- @i{eof-value}---an @i{object}.
- The default is @b{nil}.
- @i{recursive-p}---a @i{generalized boolean}.
- The default is @i{false}.
- @i{object}---an @i{object} (parsed by the @i{Lisp reader})
- or the @i{eof-value}.
- @subsubheading Description::
- @b{read} parses the printed representation of an @i{object}
- from @i{input-stream} and builds such an @i{object}.
- @b{read-preserving-whitespace} is like @b{read} but preserves
- any @i{whitespace}_2 @i{character}
- that delimits the printed representation of the @i{object}.
- @b{read-preserving-whitespace} is exactly like @b{read}
- when the @i{recursive-p} @i{argument} to @b{read-preserving-whitespace}
- is @i{true}.
- When @b{*read-suppress*} is @i{false},
- @b{read} throws away the delimiting @i{character} required by
- certain printed representations if it is a
- @i{whitespace}_2 @i{character};
- but @b{read} preserves the character
- (using @b{unread-char}) if it is
- syntactically meaningful, because it could be the start of the next expression.
- If a file ends in a @i{symbol} or a @i{number}
- immediately followed by an @i{end of file}_1,
- @b{read} reads the @i{symbol} or @i{number} successfully;
- when called again, it sees the @i{end of file}_1 and
- only then acts according to @i{eof-error-p}.
- If a file contains ignorable text at the end, such
- as blank lines and comments, @b{read}
- does not consider it to end in the
- middle of an @i{object}.
- If @i{recursive-p} is @i{true}, the call to @b{read} is
- expected to be made
- from within some function that itself
- has been called from @b{read} or from a similar input function, rather
- than from the top level.
- Both functions return the @i{object} read from @i{input-stream}.
- @i{Eof-value} is returned if @i{eof-error-p} is @i{false} and end of file
- is reached before the beginning of an @i{object}.
- @subsubheading Examples::
- @example
- (read)
- @t{ |> } @b{|>>}@t{'a}@b{<<|}
- @result{} (QUOTE A)
- (with-input-from-string (is " ") (read is nil 'the-end)) @result{} THE-END
- (defun skip-then-read-char (s c n)
- (if (char= c #\@{) (read s t nil t) (read-preserving-whitespace s))
- (read-char-no-hang s)) @result{} SKIP-THEN-READ-CHAR
- (let ((*readtable* (copy-readtable nil)))
- (set-dispatch-macro-character #\# #\@{ #'skip-then-read-char)
- (set-dispatch-macro-character #\# #\@} #'skip-then-read-char)
- (with-input-from-string (is "#@{123 x #@}123 y")
- (format t "~S ~S" (read is) (read is)))) @result{} #\x, #\Space, NIL
- @end example
- As an example, consider this @i{reader macro} definition:
- @example
- (defun slash-reader (stream char)
- (declare (ignore char))
- `(path . ,(loop for dir = (read-preserving-whitespace stream t nil t)
- then (progn (read-char stream t nil t)
- (read-preserving-whitespace stream t nil t))
- collect dir
- while (eql (peek-char nil stream nil nil t) #\/))))
- (set-macro-character #\/ #'slash-reader)
- @end example
- Consider now calling @b{read} on this expression:
- @example
- (zyedh /usr/games/zork /usr/games/boggle)
- @end example
- The @t{/} macro reads objects separated by more @t{/} characters;
- thus @t{/usr/games/zork} is intended to read as @t{(path usr games zork)}.
- The entire example expression should therefore be read as
- @example
- (zyedh (path usr games zork) (path usr games boggle))
- @end example
- However, if @b{read} had been used instead of
- @b{read-preserving-whitespace}, then after the reading of the symbol
- @t{zork}, the following space would be discarded; the next call
- to @b{peek-char} would see the following @t{/}, and the loop would
- continue, producing this interpretation:
- @example
- (zyedh (path usr games zork usr games boggle))
- @end example
- There are times when @i{whitespace}_2 should be discarded.
- If a command interpreter takes single-character commands,
- but occasionally reads an @i{object} then if the @i{whitespace}_2
- after a @i{symbol}
- is not discarded it might be interpreted as a command
- some time later after the @i{symbol} had been read.
- @subsubheading Affected By::
- @b{*standard-input*},
- @b{*terminal-io*},
- @b{*readtable*},
- @b{*read-default-float-format*},
- @b{*read-base*},
- @b{*read-suppress*},
- @b{*package*},
- @b{*read-eval*}.
- @subsubheading Exceptional Situations::
- @b{read} signals an error of @i{type} @b{end-of-file},
- regardless of @i{eof-error-p}, if
- the file ends in the middle of an @i{object} representation.
- For example, if a file does
- not contain enough right parentheses to balance the left parentheses in
- it, @b{read} signals an error.
- This is detected when @b{read} or @b{read-preserving-whitespace}
- is called with @i{recursive-p} and @i{eof-error-p} @i{non-nil},
- and end-of-file is reached before the beginning of an @i{object}.
- If @i{eof-error-p} is @i{true}, an error of @i{type} @b{end-of-file}
- is signaled at the end of file.
- @subsubheading See Also::
- @ref{peek-char}
- ,
- @ref{read-char}
- ,
- @ref{unread-char}
- ,
- @ref{read-from-string}
- ,
- @ref{read-delimited-list}
- ,
- @ref{parse-integer}
- ,
- {@ref{Syntax}},
- {@ref{Reader Concepts}}
- @node read-delimited-list, read-from-string, read, Reader Dictionary
- @subsection read-delimited-list [Function]
- @code{read-delimited-list} @i{char {&optional} input-stream recursive-p} @result{} @i{list}
- @subsubheading Arguments and Values::
- @i{char}---a @i{character}.
- @i{input-stream}---an @i{input} @i{stream designator}.
- The default is @i{standard input}.
- @i{recursive-p}---a @i{generalized boolean}.
- The default is @i{false}.
- @i{list}---a @i{list} of the @i{objects} read.
- @subsubheading Description::
- @b{read-delimited-list} reads @i{objects} from @i{input-stream}
- until the next character after an @i{object}'s
- representation (ignoring @i{whitespace}_2 characters and comments) is @i{char}.
- @b{read-delimited-list} looks ahead at each step
- for the next non-@i{whitespace}_2 @i{character}
- and peeks at it as if with @b{peek-char}.
- If it is @i{char},
- then the @i{character} is consumed and the @i{list} of @i{objects} is returned.
- If it is a @i{constituent} or @i{escape} @i{character},
- then @b{read} is used to read an @i{object},
- which is added to the end of the @i{list}.
- If it is a @i{macro character},
- its @i{reader macro function} is called;
- if the function returns a @i{value},
- that @i{value} is added to the @i{list}.
- The peek-ahead process is then repeated.
- If @i{recursive-p} is @i{true},
- this call is expected to be embedded in a higher-level call to @b{read}
- or a similar function.
- It is an error to reach end-of-file during the operation of
- @b{read-delimited-list}.
- The consequences are undefined
- if @i{char} has a @i{syntax type} of @i{whitespace}_2
- in the @i{current readtable}.
- @subsubheading Examples::
- @example
- (read-delimited-list #\{]}) 1 2 3 4 5 6 {]}
- @result{} (1 2 3 4 5 6)
- @end example
- Suppose you wanted @t{#@{{@i{a}} @i{b} @i{c} ... @i{z}@}}
- to read as a list of all pairs of the elements @i{a}, @i{b}, @i{c},
- ..., @i{z}, for example.
- @example
- #@{p q z a@} reads as ((p q) (p z) (p a) (q z) (q a) (z a))
- @end example
- This can be done by specifying a macro-character definition for @t{#@{}
- that does two things: reads in all the items up to the @t{@}},
- and constructs the pairs. @b{read-delimited-list} performs
- the first task.
- @example
- (defun |#@{-reader| (stream char arg)
- (declare (ignore char arg))
- (mapcon #'(lambda (x)
- (mapcar #'(lambda (y) (list (car x) y)) (cdr x)))
- (read-delimited-list #\@} stream t))) @result{} |#@{-reader|
- (set-dispatch-macro-character #\# #\@{ #'|#@{-reader|) @result{} T
- (set-macro-character #\@} (get-macro-character #\) @b{nil}))
- @end example
- Note that @i{true} is supplied for the @i{recursive-p} argument.
- It is necessary here to give a definition to the character @t{@}} as
- well to prevent it from being a constituent.
- If the line
- @example
- (set-macro-character #\@} (get-macro-character #\) @b{nil}))
- @end example
- shown above were not included, then the @t{@}} in
- @example
- #@{ p q z a@}
- @end example
- would be considered a constituent character, part of the symbol named
- @t{a@}}. This could be corrected by putting a space before
- the @t{@}}, but it is better to call
- @b{set-macro-character}.
- Giving @t{@}} the same
- definition as the standard definition of the character @t{)} has the
- twin benefit of making it terminate tokens for use with
- @b{read-delimited-list} and also making it invalid for use in any
- other context. Attempting to read a stray @t{@}} will signal an error.
- @subsubheading Affected By::
- @b{*standard-input*},
- @b{*readtable*},
- @b{*terminal-io*}.
- @subsubheading See Also::
- @ref{read; read-preserving-whitespace}
- ,
- @ref{peek-char}
- ,
- @ref{read-char}
- ,
- @ref{unread-char}
- .
- @subsubheading Notes::
- @b{read-delimited-list} is intended for use in implementing @i{reader macros}.
- Usually it is desirable for @i{char} to be a @i{terminating} @i{macro character}
- so that it can be used to delimit tokens; however, @b{read-delimited-list}
- makes no attempt to alter the syntax specified for @i{char} by the current
- readtable. The caller must make any necessary changes to the readtable syntax
- explicitly.
- @node read-from-string, readtable-case, read-delimited-list, Reader Dictionary
- @subsection read-from-string [Function]
- @code{read-from-string} @i{string {&optional} eof-error-p eof-value
- {&key} start end preserve-whitespace}@*
- @result{} @i{object, position}
- @subsubheading Arguments and Values::
- @i{string}---a @i{string}.
- @i{eof-error-p}---a @i{generalized boolean}.
- The default is @i{true}.
- @i{eof-value}---an @i{object}.
- The default is @b{nil}.
- @i{start}, @i{end}---@i{bounding index designators} of @i{string}.
- The defaults for @i{start} and @i{end} are @t{0} and @b{nil}, respectively.
- @i{preserve-whitespace}---a @i{generalized boolean}.
- The default is @i{false}.
- @i{object}---an @i{object} (parsed by the @i{Lisp reader})
- or the @i{eof-value}.
- @i{position}---an @i{integer} greater than or equal to zero,
- and less than or equal to
- one more than the @i{length} of the @i{string}.
- @subsubheading Description::
- Parses the printed representation of an @i{object}
- from the subsequence of @i{string} @i{bounded} by @i{start} and @i{end},
- as if @b{read} had been called on an @i{input} @i{stream}
- containing those same @i{characters}.
- If @i{preserve-whitespace} is @i{true},
- the operation will preserve @i{whitespace}_2
- as @b{read-preserving-whitespace} would do.
- If an @i{object} is successfully parsed, the @i{primary value}, @i{object},
- is the @i{object} that was parsed.
- If @i{eof-error-p} is @i{false} and if the end of the @i{substring} is reached,
- @i{eof-value} is returned.
- The @i{secondary value}, @i{position}, is the index of the first @i{character}
- in the @i{bounded} @i{string} that was not read.
- The @i{position} may depend upon the value of @i{preserve-whitespace}.
- If the entire @i{string} was read,
- the @i{position} returned is either the @i{length} of the @i{string}
- or one greater than the @i{length} of the @i{string}.
- @subsubheading Examples::
- @example
- (read-from-string " 1 3 5" t nil :start 2) @result{} 3, 5
- (read-from-string "(a b c)") @result{} (A B C), 7
- @end example
- @subsubheading Exceptional Situations::
- If the end of the supplied substring
- occurs before an @i{object} can be read, an
- error is signaled if @i{eof-error-p} is @i{true}.
- An error is signaled if the end of the @i{substring} occurs
- in the middle of an incomplete @i{object}.
- @subsubheading See Also::
- @ref{read; read-preserving-whitespace}
- ,
- @b{read-preserving-whitespace}
- @subsubheading Notes::
- The reason that @i{position} is allowed to be beyond the
- @i{length} of the @i{string} is to permit (but not require)
- the @i{implementation} to work by simulating the effect of a
- trailing delimiter at the end of the @i{bounded} @i{string}.
- When @i{preserve-whitespace} is @i{true},
- the @i{position} might count the simulated delimiter.
- @node readtable-case, readtablep, read-from-string, Reader Dictionary
- @subsection readtable-case [Accessor]
- @code{readtable-case} @i{readtable} @result{} @i{mode}
- (setf (@code{ readtable-case} @i{readtable}) mode)@*
- @subsubheading Arguments and Values::
- @i{readtable}---a @i{readtable}.
- @i{mode}---a @i{case sensitivity mode}.
- @subsubheading Description::
- @i{Accesses} the @i{readtable case} of @i{readtable},
- which affects the way in which the @i{Lisp Reader} reads @i{symbols}
- and the way in which the @i{Lisp Printer} writes @i{symbols}.
- @subsubheading Examples::
- See @ref{Examples of Effect of Readtable Case on the Lisp Reader} and @ref{Examples of Effect of Readtable Case on the Lisp Printer}.
- @subsubheading Exceptional Situations::
- Should signal an error of @i{type} @b{type-error}
- if @i{readtable} is not a @i{readtable}.
- Should signal an error of @i{type} @b{type-error}
- if @i{mode} is not a @i{case sensitivity mode}.
- @subsubheading See Also::
- @ref{readtable}
- ,
- @b{*print-escape*},
- @ref{Reader Algorithm},
- @ref{Effect of Readtable Case on the Lisp Reader},
- @ref{Effect of Readtable Case on the Lisp Printer}
- @subsubheading Notes::
- @b{copy-readtable} copies the @i{readtable case} of the @i{readtable}.
- @node readtablep, set-dispatch-macro-character, readtable-case, Reader Dictionary
- @subsection readtablep [Function]
- @code{readtablep} @i{object} @result{} @i{generalized-boolean}
- @subsubheading Arguments and Values::
- @i{object}---an @i{object}.
- @i{generalized-boolean}---a @i{generalized boolean}.
- @subsubheading Description::
- Returns @i{true} if @i{object} is of @i{type} @b{readtable};
- otherwise, returns @i{false}.
- @subsubheading Examples::
- @example
- (readtablep *readtable*) @result{} @i{true}
- (readtablep (copy-readtable)) @result{} @i{true}
- (readtablep '*readtable*) @result{} @i{false}
- @end example
- @subsubheading Notes::
- @example
- (readtablep @i{object}) @equiv{} (typep @i{object} 'readtable)
- @end example
- @node set-dispatch-macro-character, set-macro-character, readtablep, Reader Dictionary
- @subsection set-dispatch-macro-character, get-dispatch-macro-character
- @flushright
- @i{[Function]}
- @end flushright
- @code{get-dispatch-macro-character} @i{disp-char sub-char {&optional} readtable} @result{} @i{function}
- @code{set-dispatch-macro-character} @i{disp-char sub-char new-function {&optional} readtable} @result{} @i{@b{t}}
- @subsubheading Arguments and Values::
- @i{disp-char}---a @i{character}.
- @i{sub-char}---a @i{character}.
- @i{readtable}---a @i{readtable designator}.
- The default is the @i{current readtable}.
- @i{function}---a @i{function designator} or @b{nil}.
- @i{new-function}---a @i{function designator}.
- @subsubheading Description::
- @b{set-dispatch-macro-character} causes @i{new-function} to be called
- when @i{disp-char} followed by @i{sub-char} is read.
- If @i{sub-char} is a lowercase letter,
- it is converted to its uppercase equivalent.
- It is an error if @i{sub-char} is one of the ten decimal digits.
- @b{set-dispatch-macro-character} installs a @i{new-function} to be called
- when a particular @i{dispatching macro character} pair is read.
- @i{New-function} is installed as the dispatch function to be
- called when @i{readtable} is in use and when @i{disp-char} is followed by
- @i{sub-char}.
- For more information about how the @i{new-function} is invoked,
- see @ref{Macro Characters}.
- @b{get-dispatch-macro-character} retrieves
- the dispatch function associated with @i{disp-char} and @i{sub-char}
- in @i{readtable}.
- @b{get-dispatch-macro-character} returns the macro-character function
- for @i{sub-char} under @i{disp-char}, or @b{nil} if there is no
- function associated with @i{sub-char}.
- If @i{sub-char} is a decimal digit, @b{get-dispatch-macro-character}
- returns @b{nil}.
- @subsubheading Examples::
- @example
- (get-dispatch-macro-character #\# #\@{) @result{} NIL
- (set-dispatch-macro-character #\# #\@{ ;dispatch on #@{
- #'(lambda(s c n)
- (let ((list (read s nil (values) t))) ;list is object after #n@{
- (when (consp list) ;return nth element of list
- (unless (and n (< 0 n (length list))) (setq n 0))
- (setq list (nth n list)))
- list))) @result{} T
- #@{(1 2 3 4) @result{} 1
- #3@{(0 1 2 3) @result{} 3
- #@{123 @result{} 123
- @end example
- If it is desired that @t{#$@i{foo}} :
- as if it were @t{(dollars @i{foo})}.
- @example
- (defun |#$-reader| (stream subchar arg)
- (declare (ignore subchar arg))
- (list 'dollars (read stream t nil t))) @result{} |#$-reader|
- (set-dispatch-macro-character #\# #\$ #'|#$-reader|) @result{} T
- @end example
- @subsubheading See Also::
- @ref{Macro Characters}
- @subsubheading Side Effects::
- The @i{readtable} is modified.
- @subsubheading Affected By::
- @b{*readtable*}.
- @subsubheading Exceptional Situations::
- For either function, an error is signaled if @i{disp-char} is not
- a @i{dispatching macro character} in @i{readtable}.
- @subsubheading See Also::
- @ref{readtable}
- @subsubheading Notes::
- It is necessary
- to use @b{make-dispatch-macro-character} to set up the
- dispatch character before specifying its sub-characters.
- @node set-macro-character, set-syntax-from-char, set-dispatch-macro-character, Reader Dictionary
- @subsection set-macro-character, get-macro-character [Function]
- @code{get-macro-character} @i{char {&optional} readtable} @result{} @i{function, non-terminating-p}
- @code{set-macro-character} @i{char new-function {&optional} non-terminating-p readtable} @result{} @i{@b{t}}
- @subsubheading Arguments and Values::
- @i{char}---a @i{character}.
- @i{non-terminating-p}---a @i{generalized boolean}.
- The default is @i{false}.
- @i{readtable}---a @i{readtable designator}.
- The default is the @i{current readtable}.
- @i{function}---@b{nil},
- or a @i{designator} for a @i{function} of two @i{arguments}.
- @i{new-function}---a @i{function designator}.
- @subsubheading Description::
- @b{get-macro-character} returns as its @i{primary value}, @i{function},
- the @i{reader macro function} associated with @i{char} in @i{readtable} (if any),
- or else @b{nil} if @i{char} is not a @i{macro character} in @i{readtable}.
- The @i{secondary value}, @i{non-terminating-p}, is @i{true}
- if @i{char} is a @i{non-terminating} @i{macro character};
- otherwise, it is @i{false}.
- @b{set-macro-character} causes @i{char} to be a @i{macro character}
- associated with the @i{reader macro function} @i{new-function}
- (or the @i{designator} for @i{new-function}) in @i{readtable}.
- If @i{non-terminating-p} is @i{true},
- @i{char} becomes a @i{non-terminating} @i{macro character};
- otherwise it becomes a @i{terminating} @i{macro character}.
- @subsubheading Examples::
- @example
- (get-macro-character #\@{) @result{} NIL, @i{false}
- (not (get-macro-character #\;)) @result{} @i{false}
- @end example
- The following is a possible definition for the @i{single-quote} @i{reader macro}
- in @i{standard syntax}:
- @example
- (defun single-quote-reader (stream char)
- (declare (ignore char))
- (list 'quote (read stream t nil t))) @result{} SINGLE-QUOTE-READER
- (set-macro-character #\' #'single-quote-reader) @result{} T
- @end example
- Here @t{single-quote-reader} reads an @i{object} following the @i{single-quote}
- and returns a @i{list} of @b{quote} and that @i{object}.
- The @i{char} argument is ignored.
- The following is a possible definition for the @i{semicolon} @i{reader macro}
- in @i{standard syntax}:
- @example
- (defun semicolon-reader (stream char)
- (declare (ignore char))
- ;; First swallow the rest of the current input line.
- ;; End-of-file is acceptable for terminating the comment.
- (do () ((char= (read-char stream nil #\Newline t) #\Newline)))
- ;; Return zero values.
- (values)) @result{} SEMICOLON-READER
- (set-macro-character #\; #'semicolon-reader) @result{} T
- @end example
- @subsubheading Side Effects::
- The @i{readtable} is modified.
- @subsubheading See Also::
- @ref{readtable}
- @node set-syntax-from-char, with-standard-io-syntax, set-macro-character, Reader Dictionary
- @subsection set-syntax-from-char [Function]
- @code{set-syntax-from-char} @i{to-char from-char {&optional} to-readtable from-readtable} @result{} @i{@b{t}}
- @subsubheading Arguments and Values::
- @i{to-char}---a @i{character}.
- @i{from-char}---a @i{character}.
- @i{to-readtable}---a @i{readtable}.
- The default is the @i{current readtable}.
- @i{from-readtable}---a @i{readtable designator}.
- The default is the @i{standard readtable}.
- @subsubheading Description::
- @b{set-syntax-from-char} makes
- the syntax of @i{to-char} in @i{to-readtable} be the same as
- the syntax of @i{from-char} in @i{from-readtable}.
- @b{set-syntax-from-char} copies the @i{syntax types} of @i{from-char}.
- If @i{from-char} is a @i{macro character},
- its @i{reader macro function} is copied also.
- If the character is a @i{dispatching macro character},
- its entire dispatch table of @i{reader macro functions} is copied.
- The @i{constituent traits} of @i{from-char} are not copied.
- A macro definition from a character such as
- @t{"} can be copied to another character; the standard definition for @t{"}
- looks for another character that is the same as the character that
- invoked it. The definition of @t{(} can not be meaningfully copied
- to @t{@{}, on the other hand.
- The result is that @i{lists} are of the form
- @t{@{a b c)}, not @t{@{a b c@}},
- because the definition
- always looks for a closing parenthesis, not a closing brace.
- @subsubheading Examples::
- @example
- (set-syntax-from-char #\7 #\;) @result{} T
- 123579 @result{} 1235
- @end example
- @subsubheading Side Effects::
- The @i{to-readtable} is modified.
- @subsubheading Affected By::
- The existing values in the @i{from-readtable}.
- @subsubheading See Also::
- @ref{set-macro-character; get-macro-character}
- ,
- @ref{make-dispatch-macro-character}
- ,
- @ref{Character Syntax Types}
- @subsubheading Notes::
- The @i{constituent traits} of a @i{character} are ``hard wired''
- into the parser for extended @i{tokens}. For example, if the definition
- of @t{S} is copied to @t{*}, then @t{*} will become a @i{constituent}
- that is @i{alphabetic}_2 but that cannot be used as a
- @i{short float} @i{exponent marker}.
- For further information, see @ref{Constituent Traits}.
- @node with-standard-io-syntax, *read-base*, set-syntax-from-char, Reader Dictionary
- @subsection with-standard-io-syntax [Macro]
- @code{with-standard-io-syntax} @i{@{@i{form}@}{*}} @result{} @i{@{@i{result}@}{*}}
- @subsubheading Arguments and Values::
- @i{forms}---an @i{implicit progn}.
- @i{results}---the @i{values} returned by the @i{forms}.
- @subsubheading Description::
- Within the dynamic extent of the body of @i{forms}, all reader/printer control
- variables, including any @i{implementation-defined} ones not specified by
- this standard, are bound to values that produce standard read/print
- behavior. The values for the variables specified by this standard are listed in
- Figure 23--1.
- [Reviewer Note by Barrett: *print-pprint-dispatch* should probably be mentioned here, too.]
- @group
- @noindent
- @w{ Variable Value }
- @w{ @b{*package*} The @t{CL-USER} @i{package} }
- @w{ @b{*print-array*} @b{t} }
- @w{ @b{*print-base*} @t{10} }
- @w{ @b{*print-case*} @t{:upcase} }
- @w{ @b{*print-circle*} @b{nil} }
- @w{ @b{*print-escape*} @b{t} }
- @w{ @b{*print-gensym*} @b{t} }
- @w{ @b{*print-length*} @b{nil} }
- @w{ @b{*print-level*} @b{nil} }
- @w{ @b{*print-lines*} @b{nil} }
- @w{ @b{*print-miser-width*} @b{nil} }
- @w{ @b{*print-pprint-dispatch*} The @i{standard pprint dispatch table} }
- @w{ @b{*print-pretty*} @b{nil} }
- @w{ @b{*print-radix*} @b{nil} }
- @w{ @b{*print-readably*} @b{t} }
- @w{ @b{*print-right-margin*} @b{nil} }
- @w{ @b{*read-base*} @t{10} }
- @w{ @b{*read-default-float-format*} @b{single-float} }
- @w{ @b{*read-eval*} @b{t} }
- @w{ @b{*read-suppress*} @b{nil} }
- @w{ @b{*readtable*} The @i{standard readtable} }
- @noindent
- @w{ Figure 23--1: Values of standard control variables }
- @end group
- @subsubheading Examples::
- @example
- (with-open-file (file pathname :direction :output)
- (with-standard-io-syntax
- (print data file)))
- ;;; ... Later, in another Lisp:
- (with-open-file (file pathname :direction :input)
- (with-standard-io-syntax
- (setq data (read file))))
- @end example
- @node *read-base*, *read-default-float-format*, with-standard-io-syntax, Reader Dictionary
- @subsection *read-base* [Variable]
- @subsubheading Value Type::
- a @i{radix}.
- @subsubheading Initial Value::
- @t{10}.
- @subsubheading Description::
- Controls the interpretation of tokens by @b{read} as being
- @i{integers} or @i{ratios}.
- The @i{value} of @b{*read-base*}, called the @i{current input base}
- @IGindex{current input base}
- ,
- is the radix in which @i{integers} and
- @i{ratios} are to be read by the @i{Lisp reader}.
- The parsing of other numeric @i{types} (@i{e.g.}, @i{floats}) is
- not affected by this option.
- The effect of @b{*read-base*} on the reading of any particular
- @i{rational} number can be locally overridden by explicit use of the
- @t{#O}, @t{#X}, @t{#B}, or @t{#@i{n}R} syntax
- or by a trailing decimal point.
- @subsubheading Examples::
- @example
- (dotimes (i 6)
- (let ((*read-base* (+ 10. i)))
- (let ((object (read-from-string "(\\DAD DAD |BEE| BEE 123. 123)")))
- (print (list *read-base* object)))))
- @t{ |> } (10 (DAD DAD BEE BEE 123 123))
- @t{ |> } (11 (DAD DAD BEE BEE 123 146))
- @t{ |> } (12 (DAD DAD BEE BEE 123 171))
- @t{ |> } (13 (DAD DAD BEE BEE 123 198))
- @t{ |> } (14 (DAD 2701 BEE BEE 123 227))
- @t{ |> } (15 (DAD 3088 BEE 2699 123 258))
- @result{} NIL
- @end example
- @subsubheading Notes::
- Altering the input radix can be useful when reading data files in special formats.
- @node *read-default-float-format*, *read-eval*, *read-base*, Reader Dictionary
- @subsection *read-default-float-format* [Variable]
- @subsubheading Value Type::
- one of the @i{atomic type specifiers}
- @b{short-float},
- @b{single-float},
- @b{double-float},
- or @b{long-float},
- or else some other @i{type specifier} defined
- by the @i{implementation} to be acceptable.
- @subsubheading Initial Value::
- The @i{symbol} @b{single-float}.
- @subsubheading Description::
- Controls the floating-point format that is to be used when reading a
- floating-point number that has no @i{exponent marker} or that has
- @t{e} or @t{E} for an @i{exponent marker}. Other @i{exponent markers}
- explicitly prescribe the floating-point format to be used.
- The printer uses @b{*read-default-float-format*} to guide the
- choice of @i{exponent markers} when printing floating-point numbers.
- @subsubheading Examples::
- @example
- (let ((*read-default-float-format* 'double-float))
- (read-from-string "(1.0 1.0e0 1.0s0 1.0f0 1.0d0 1.0L0)"))
- @result{} (1.0 1.0 1.0 1.0 1.0 1.0) ;Implementation has float format F.
- @result{} (1.0 1.0 1.0s0 1.0 1.0 1.0) ;Implementation has float formats S and F.
- @result{} (1.0d0 1.0d0 1.0 1.0 1.0d0 1.0d0) ;Implementation has float formats F and D.
- @result{} (1.0d0 1.0d0 1.0s0 1.0 1.0d0 1.0d0) ;Implementation has float formats S, F, D.
- @result{} (1.0d0 1.0d0 1.0 1.0 1.0d0 1.0L0) ;Implementation has float formats F, D, L.
- @result{} (1.0d0 1.0d0 1.0s0 1.0 1.0d0 1.0L0) ;Implementation has formats S, F, D, L.
- @end example
- @node *read-eval*, *read-suppress*, *read-default-float-format*, Reader Dictionary
- @subsection *read-eval* [Variable]
- @subsubheading Value Type::
- a @i{generalized boolean}.
- @subsubheading Initial Value::
- @i{true}.
- @subsubheading Description::
- If it is @i{true}, the @t{#.} @i{reader macro} has its normal effect.
- Otherwise, that @i{reader macro} signals an error of @i{type} @b{reader-error}.
- @subsubheading See Also::
- @b{*print-readably*}
- @subsubheading Notes::
- If @b{*read-eval*} is @i{false} and @b{*print-readably*} is @i{true},
- any @i{method} for @b{print-object} that would output a reference
- to the @t{#.} @i{reader macro} either outputs something different
- or signals an error of @i{type} @b{print-not-readable}.
- @node *read-suppress*, *readtable*, *read-eval*, Reader Dictionary
- @subsection *read-suppress* [Variable]
- @subsubheading Value Type::
- a @i{generalized boolean}.
- @subsubheading Initial Value::
- @i{false}.
- @subsubheading Description::
- This variable is intended primarily to support the operation of the
- read-time conditional notations @t{#+} and @t{#-}. It is important for the
- @i{reader macros} which implement these notations
- to be able to skip over the printed representation of an
- @i{expression} despite the possibility that the syntax of the skipped
- @i{expression} may not be entirely valid for the current implementation,
- since @t{#+} and @t{#-} exist in order to allow the same program to be
- shared among several @r{Lisp} implementations (including dialects other than @r{Common Lisp})
- despite small incompatibilities of syntax.
- If it is @i{false}, the @i{Lisp reader} operates normally.
- If the @i{value} of @b{*read-suppress*} is @i{true},
- @b{read},
- @b{read-preserving-whitespace},
- @b{read-delimited-list},
- and @b{read-from-string}
- all return a @i{primary value} of @b{nil} when they complete successfully;
- however, they continue to parse the representation of an @i{object}
- in the normal way, in order to skip over the @i{object},
- and continue to indicate @i{end of file} in the normal way.
- Except as noted below,
- any @i{standardized} @i{reader macro}_2
- that is defined to @i{read}_2
- a following @i{object} or @i{token}
- will do so,
- but not signal an error if the @i{object}
- read is not of an appropriate type or syntax.
- The @i{standard syntax} and its associated @i{reader macros}
- will not construct any new @i{objects}
- (@i{e.g.}, when reading the representation of a @i{symbol},
- no @i{symbol} will be constructed or interned).
- @table @asis
- @item Extended tokens
- All extended tokens are completely uninterpreted.
- Errors such as those that might otherwise be signaled due to
- detection of invalid @i{potential numbers},
- invalid patterns of @i{package markers},
- and invalid uses of the @i{dot} character are suppressed.
- @item Dispatching macro characters (including @i{sharpsign})
- @i{Dispatching macro characters} continue to parse an infix numerical
- argument, and invoke the dispatch function. The @i{standardized}
- @i{sharpsign} @i{reader macros} do not enforce any constraints
- on either the presence of or the value of the numerical argument.
- @item #=
- The @t{#=} notation is totally ignored. It does not read
- a following @i{object}. It produces no @i{object},
- but is treated as @i{whitespace}_2.
- @item ##
- The @t{##} notation always produces @b{nil}.
- @end table
- No matter what the @i{value} of @b{*read-suppress*},
- parentheses still continue to delimit and construct @i{lists};
- the @t{#(} notation continues to delimit @i{vectors};
- and comments, @i{strings},
- and the @i{single-quote} and @i{backquote} notations continue to be
- interpreted properly. Such situations as
- @t{')}, @t{#<},
- @t{#)}, and @t{#<@i{Space}>} continue to signal errors.
- @subsubheading Examples::
- @example
- (let ((*read-suppress* t))
- (mapcar #'read-from-string
- '("#(foo bar baz)" "#P(:type :lisp)" "#c1.2"
- "#.(PRINT 'FOO)" "#3AHELLO" "#S(INTEGER)"
- "#*ABC" "#\GARBAGE" "#RALPHA" "#3R444")))
- @result{} (NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL)
- @end example
- @subsubheading See Also::
- @ref{read; read-preserving-whitespace}
- ,
- {@ref{Syntax}}
- @subsubheading Notes::
- @i{Programmers} and @i{implementations} that define additional
- @i{macro characters} are strongly encouraged to make them respect
- @b{*read-suppress*} just as @i{standardized} @i{macro characters} do.
- That is, when the @i{value} of @b{*read-suppress*} is @i{true},
- they should ignore type errors when reading a following @i{object}
- and the @i{functions} that implement @i{dispatching macro characters}
- should tolerate @b{nil} as their infix @i{parameter} value even if a numeric
- value would ordinarily be required.
- @node *readtable*, reader-error, *read-suppress*, Reader Dictionary
- @subsection *readtable* [Variable]
- @subsubheading Value Type::
- a @i{readtable}.
- @subsubheading Initial Value::
- A @i{readtable} that conforms to the description of @r{Common Lisp} syntax in @ref{Syntax}.
- @subsubheading Description::
- The @i{value} of @b{*readtable*} is called the @i{current readtable}.
- It controls the parsing behavior of the @i{Lisp reader},
- and can also influence the @i{Lisp printer} (@i{e.g.}, see the @i{function} @b{readtable-case}).
- @subsubheading Examples::
- @example
- (readtablep *readtable*) @result{} @i{true}
- (setq zvar 123) @result{} 123
- (set-syntax-from-char #\z #\' (setq table2 (copy-readtable))) @result{} T
- zvar @result{} 123
- (setq *readtable* table2) @result{} #<READTABLE>
- zvar @result{} VAR
- (setq *readtable* (copy-readtable nil)) @result{} #<READTABLE>
- zvar @result{} 123
- @end example
- @subsubheading Affected By::
- @b{compile-file},
- @b{load}
- @subsubheading See Also::
- @ref{compile-file}
- ,
- @ref{load}
- ,
- @ref{readtable}
- ,
- @ref{The Current Readtable}
- @node reader-error, , *readtable*, Reader Dictionary
- @subsection reader-error [Condition Type]
- @subsubheading Class Precedence List::
- @b{reader-error},
- @b{parse-error},
- @b{stream-error},
- @b{error},
- @b{serious-condition},
- @b{condition},
- @b{t}
- @subsubheading Description::
- The @i{type} @b{reader-error} consists of
- error conditions that are related to tokenization and parsing
- done by the @i{Lisp reader}.
- @subsubheading See Also::
- @ref{read; read-preserving-whitespace}
- ,
- @ref{stream-error-stream}
- ,
- @ref{Reader Concepts}
- @c end of including dict-reader
- @c %**end of chapter
|