Artifact e7b26fbeea0f7465e79fc6dac2711392a367cfd5c9d33e76d465a512e919906c:
- File
psl-1983/3-1/lpt/12-io.lpt
— part of check-in
[eb17ceb7f6]
at
2020-04-21 19:40:01
on branch master
— Add Reduce 3.0 to the historical section of the archive, and some more
files relating to version sof PSL from the early 1980s. Thanks are due to
Paul McJones and Nelson Beebe for these, as well as to all the original
authors.git-svn-id: https://svn.code.sf.net/p/reduce-algebra/code/historical@5328 2bfe0521-f11c-4a00-b80e-6202646ff360 (user: arthurcnorman@users.sourceforge.net, size: 85359) [annotate] [blame] [check-ins using] [more...]
- File
psl-1983/lpt/12-io.lpt
— part of check-in
[eb17ceb7f6]
at
2020-04-21 19:40:01
on branch master
— Add Reduce 3.0 to the historical section of the archive, and some more
files relating to version sof PSL from the early 1980s. Thanks are due to
Paul McJones and Nelson Beebe for these, as well as to all the original
authors.git-svn-id: https://svn.code.sf.net/p/reduce-algebra/code/historical@5328 2bfe0521-f11c-4a00-b80e-6202646ff360 (user: arthurcnorman@users.sourceforge.net, size: 85359) [annotate] [blame] [check-ins using]
PSL Manual 7 February 1983 Input and Output section 12.0 page 12.1 CHAPTER 12 CHAPTER 12 CHAPTER 12 INPUT AND OUTPUT INPUT AND OUTPUT INPUT AND OUTPUT 12.1. Introduction . . . . . . . . . . . . . . . 12.1 12.2. The Underlying Primitives for Input and Output. . . . 12.1 12.3. Opening, Closing, and Selecting Channels. . . . . . 12.5 12.4. Functions for Printing. . . . . . . . . . . . 12.8 12.5. Functions for Reading . . . . . . . . . . . . 12.16 12.5.1. Reading S-Expression . . . . . . . . . . 12.16 12.5.2. Reading Files into PSL . . . . . . . . . 12.17 12.5.3. Reading Single Characters . . . . . . . . 12.20 12.5.4. Reading Tokens . . . . . . . . . . . . 12.21 12.5.5. Read Macros . . . . . . . . . . . . . 12.30 12.6. Scan Table Utility Functions. . . . . . . . . . 12.31 12.7. I/O to and from Lists and Strings . . . . . . . . 12.32 12.8. Example of Simple I/O in PSL. . . . . . . . . . 12.34 12.1. Introduction 12.1. Introduction 12.1. Introduction Most LISP programs are written with no sophisticated I/O, so this chapter may be skimmed by those with simple I/O requirements. Section 12.8 contains an example showing the use of some I/O functions. This should help the beginning PSL user get started. Sections 12.5 and 12.6 deal extensively with customizing the scanner and reader, which is of interest only to the sophisticated user. 12.2. The Underlying Primitives for Input and Output 12.2. The Underlying Primitives for Input and Output 12.2. The Underlying Primitives for Input and Output All input and output functions are implemented in terms of operations on 1 _______ "channels". A channel is just a small integer which has 3 functions and some other information associated with it. The three functions are: a. A reading function, which is called with the channel as its _______ argument and returns the integer ASCII value of the next _______________ 1 The range of channel numbers is from 0 to MaxChannels, where MaxChannels is a system-dependent constant, currently 31, defined in IO-DATA.RED. MaxChannels is a WCONST, and is not available for use at runtime. Input and Output 7 February 1983 PSL Manual page 12.2 section 12.2 character of the input stream. If the channel is for writing WriteOnlyChannel WriteOnlyChannel only, this function is WriteOnlyChannel. If the channel has not ChannelNotOpen ChannelNotOpen been opened, this function is ChannelNotOpen. The reading function is responsible for echoing characters if the flag WriteChar WriteChar !*ECHO is T. It should use the function WriteChar to echo the character. It may not be appropriate for a read function to echo characters. For example, the "disk" reading function does Compress Compress echoing, while the reader used to implement the Compress function does not. The read function must also be concerned with the handling of ends of "files" (actually, ends of channels) and ends of lines. It should return the ASCII code for an end of file character (system dependent) when reaching the end of a channel. It should return the ASCII code for a line feed character to indicate an end of line (or "newline"). This may require that the ASCII code for carriage return be ignored when read, not returned. b. A writing function, which is called with the channel as its _______ first argument and the integer ASCII value of the character to write as its second argument. If the channel is for reading ReadOnlyChannel ReadOnlyChannel only, this function is ReadOnlyChannel. If the channel has not ChannelNotOpen ChannelNotOpen been opened, this function is ChannelNotOpen. c. A closing function, which is called with the channel as its argument and performs any action necessary for the graceful termination of input and/or output operations to that channel. ChannelNotOpen ChannelNotOpen If the channel is not open, this function is ChannelNotOpen. The other information associated with a channel includes the current Posn Posn position in the output line (used by Posn), the maximum line length allowed LineLength LineLength (used by LineLength and the printing functions), the single character input backup buffer (used by the token scanner), and other system-dependent information. Ordinarily, the user need not be aware of the existence of this mechanism. However, because of its generality, it is possible to implement operations other than just reading from and writing to files using it. In Explode Compress Explode Compress particular, the LISP functions Explode and Compress are performed by ____ ____ writing to a list and reading from a list, respectively (on channels 3 and 4 respectively). Ordinarily, user interaction with the system is done by reading from the standard input channel and writing to the standard output channel. These are 0 and 1 respectively, to which the GLOBAL variables STDIN!* and STDOUT!* are bound. These channels usually refer to the user's terminal, and cannot be closed. Other files are accessed by calling the function Open Open Open, which returns a channel. Most functions which perform input and output come in two forms, one which takes a channel as its first argument, Rds Rds and one which uses the "currently selected channel". The functions Rds and PSL Manual 7 February 1983 Input and Output section 12.2 page 12.3 Wrs Wrs Wrs are used to change the currently selected input and output channels. The GLOBAL variables IN!* and OUT!* are bound to these channels. GLOBAL variables containing information about channels are listed below. __________ ______ IN!* [Initially: 0] global Contains the currently selected input channel. This is changed Rds Rds by the function Rds. __________ ______ OUT!* [Initially: 1] global Contains the currently selected output channel. This is changed Wrs Wrs by the function Wrs. __________ ______ STDIN!* [Initially: 0] global The standard input channel. __________ ______ STDOUT!* [Initially: 1] global The standard output channel. __________ ______ BREAKIN!* [Initially: NIL] global BREAK BREAK The channel from which the BREAK loop gets its input. It has been set to default to STDIN!*, but may have to be changed on some systems with buffered-IO. __________ ______ BREAKOUT!* [Initially: NIL] global BREAK BREAK The channel to which the BREAK loop sends its output. It has been set to default to STDOUT!*, but may have to be changed on some systems with buffered-IO. __________ ______ HELPIN!* [Initially: NIL] global Help Help The channel used for input by the Help mechanism. __________ ______ HELPOUT!* [Initially: NIL] global Help Help The channel used for output by the Help mechanism. Input and Output 7 February 1983 PSL Manual page 12.4 section 12.2 __________ ______ ERROUT!* [Initially: 1] global ErrorPrintF ErrorPrintF The channel used by the ErrorPrintF. __________ ______ PROMPTSTRING!* [Initially: "lisp>"] global Displayed as a prompt when any input is taken from TTY. Thus prompts should not be directly printed. Instead the value should be bound to PROMPTSTRING!*. 12.3. Opening, Closing, and Selecting Channels 12.3. Opening, Closing, and Selecting Channels 12.3. Opening, Closing, and Selecting Channels Open Open ________ ______ __________ __ _______ __ _______ ____ (Open FILENAME:string ACCESSTYPE:id): CHANNEL:io-channel expr Eq __________ Eq If ACCESSTYPE is Eq to INPUT or OUTPUT, an attempt is made to ________ access the system-dependent FILENAME for reading or writing. If the attempt is unsuccessful, an error is generated; otherwise a free channel is returned and initialized to the default conditions for ordinary file input or output. Eq __________ Eq If ACCESSTYPE is Eq to SPECIAL and the GLOBAL variables SPECIALREADFUNCTION!*, SPECIALWRITEFUNCTION!*, and __ SPECIALCLOSEFUNCTION!* are bound to ids, then a free channel is returned and its associated functions are set to the values of these variables. Other non system-dependent status is set to default conditions, which can later be overridden. The functions ReadOnlyChannel WriteOnlyChannel ReadOnlyChannel WriteOnlyChannel ReadOnlyChannel and WriteOnlyChannel are available as error ________ handlers. The parameter FILENAME is used only if an error occurs. [??? We should replace these globals and SPECIAL option by a [??? We should replace these globals and SPECIAL option by a [??? We should replace these globals and SPECIAL option by a (SPECIALOPEN Readfunction writefunction closefunction) call (SPECIALOPEN Readfunction writefunction closefunction) call (SPECIALOPEN Readfunction writefunction closefunction) call ???] ???] ???] If none of these conditions hold, a file is not available, or there are no free channels, an error is generated. ***** Unknown access type ***** Improperly set-up special IO open call ***** File not found ***** No free channels FileP FileP One can use FileP to find out whether a file exists. PSL Manual 7 February 1983 Input and Output section 12.3 page 12.5 FileP FileP ____ ______ _______ ____ (FileP NAME:string): boolean expr ____ This function will return T if file NAME can be opened, and NIL if not, e.g. if it does not exist. Close Close _______ __ _______ __ _______ ____ (Close CHANNEL:io-channel): io-channel expr _______ The closing function associated with CHANNEL is called, with _______ _______ CHANNEL as its argument. If it is illegal to close CHANNEL, if _______ _______ CHANNEL is not open, or if CHANNEL is associated with a file and the file cannot be closed by the operating system, this function _______ generates an error. Otherwise, CHANNEL is marked as free and is returned. Shut Shut _ ______ ____ ________ _____ (Shut [L:string]): None Returned macro Shut _ Shut Closes the output files in the list L. Note that Shut takes file Close Close __ _______ names as arguments, while Close takes an io-channel. The RLISP IN IN IN function maintains a stack of file-name . io-channel shut shut associations for this purpose. Thus a shut will also correctly select the previous file for further output. EvShut EvShut _ ______ ____ ____ ________ ____ (EvShut L:string-list): none Returned expr Shut Shut Does the same as Shut but evaluates its arguments. Rds Rds _______ __ _______ ___ __ _______ ____ (Rds {CHANNEL:io-channel, NIL}): io-channel expr Rds Rds Rds sets IN!* to the value of its argument, and returns the previous value of IN!*. In addition, if SPECIALRDSACTION!* is non-NIL, it should be a function of 2 arguments, which is called _______ _______ with the old CHANNEL as its first argument and the new CHANNEL as Rds Rds Rds Rds its second argument. Rds(NIL) does the same as Rds(STDIN!*). Wrs Wrs _______ __ _______ ___ __ _______ ____ (Wrs {CHANNEL:io-channel, NIL}): io-channel expr Wrs Wrs Wrs sets OUT!* to the value of its argument and returns the previous value of OUT!*. In addition, if SPECIALWRSACTION!* is non-NIL, it should be a function of 2 arguments, which is called _______ _______ with the old CHANNEL as its first argument and the new CHANNEL as Wrs Wrs Wrs Wrs its second argument. Wrs(NIL) does the same as Wrs(STDOUT!*). Out Out _ ______ ____ ________ _____ (Out U:string): None Returned macro _ Opens file U for output, redirecting standard output. Note that Out Wrs Out ______ Wrs __ _______ Out takes a string as an argument, while Wrs takes an io-channel. Input and Output 7 February 1983 PSL Manual page 12.6 section 12.3 EvOut EvOut _ ______ ____ ____ ________ ____ (EvOut L:string-list): None Returned expr _ L is a list containing one file name which must be a string. EvOut Out EvOut Out EvOut is the called by Out after evaluating its argument. The reading and writing functions come in two flavors: those that read or RDS WRS RDS WRS write to the current channel, as set by a previous RDS or WRS into IN!* or OUT!*, and those that explicitly designate the desired input or output Channel Channel channel. The latter typically have a Channel as part of their name. ________ The following GLOBALs are used by the functions in this section. __________ ______ SPECIALCLOSEFUNCTION!* [Initially: NIL] global __________ ______ SPECIALRDSACTION!* [Initially: NIL] global __________ ______ SPECIALREADFUNCTION!* [Initially: NIL] global __________ ______ SPECIALWRITEFUNCTION!* [Initially: NIL] global __________ ______ SPECIALWRSACTION!* [Initially: NIL] global 12.4. Functions for Printing 12.4. Functions for Printing 12.4. Functions for Printing ChannelWriteChar ChannelWriteChar _______ __ _______ __ _________ _________ ____ (ChannelWriteChar CHANNEL:io-channel CH:character): character expr _______ Write one character to CHANNEL. All output is defined in terms __ of this function. If CH is equal to char EOL (ASCII LF, 8#12) _______ the line counter POSN associated with CHANNEL is set to zero. Otherwise, it is increased by one. The writing function _______ _______ __ associated with CHANNEL is called with CHANNEL and CH as its arguments. WriteChar WriteChar __ _________ _________ ____ (WriteChar CH:character): character expr Write single character to current output. (de WRITECHAR (CH) (CHANNELWRITECHAR OUT!* CH)) PSL Manual 7 February 1983 Input and Output section 12.4 page 12.7 ChannelPrin1 ChannelPrin1 ____ __ _______ ___ ___ ___ ___ ____ (ChannelPrin1 CHAN:io-channel ITM:any): ITM:any expr ChannelPrin1 ChannelPrin1 ChannelPrin1 is the basic LISP printing function. For well-formed, non-circular (non-self-referential) structures, the Read Read result can be parsed by the function Read. ______ - Strings are printed surrounded by double quotes ("). __ - Delimiters inside ids are preceded by the escape character (!). _____ - Floats are printed as {-}nnn.nnn{E{-}nn}. _______ - Integers are printed as {-}nnn, unless the value of OUTPUTBASE!* is not 10, in which case they are printed as {-}r#nnn; r is the value of OutPutBase!*. ____ - Pairs are printed in list-notation. For example, (a . (b . c)) is printed as (a b . c) while (a . (b . (c . NIL))) is printed as (a b c) ______ ______ - Vectors are printed in vector-notation; a vector of three elements a, b, and c is printed as [a b c]. Read Read The following items can be printed, but cannot be parsed by Read. ____ _______ - code-pointers are printed as ________ _____ _____ _______ _____ _______ #<Code argument-count octal-address>. where octal-address is the octal machine address of the entry point of the code Input and Output 7 February 1983 PSL Manual page 12.8 section 12.4 ______ ________ _____ vector, and argument-count is the number of arguments that the code takes. The argument count cannot always be determined, in which case nothing is printed for the ________ _____ argument-count. - Anything else is printed as #<Unknown:nnnn>, where nnnn is the octal value found in the argument register. Such items are not legal LISP entities and may cause garbage collector errors if they are found in the heap. Prin1 Prin1 ___ ___ ___ ___ ____ (Prin1 ITM:any): ITM:any expr ErrPrin ErrPrin _ ___ ____ ________ ____ (ErrPrin U:any): None Returned expr Prin1 Prin1 _ Prin1 with special quotes to highlight U. ChannelPrin2 ChannelPrin2 ____ __ _______ ___ ___ ___ ___ ____ (ChannelPrin2 CHAN:io-channel ITM:any): ITM:any expr ChannelPrin2 ChannelPrin1 ChannelPrin2 ChannelPrin1 ______ ChannelPrin2 is similar to ChannelPrin1, except that strings are printed without the surrounding double quotes, and delimiters __ within ids are not preceded by the escape character. Prin2 Prin2 ___ ___ ___ ___ ____ (Prin2 ITM:any): ITM:any expr ChannelPrinC ChannelPrinC ____ __ _______ ___ ___ ___ ___ ____ (ChannelPrinC CHAN:io-channel ITM:any): ITM:any expr ChannelPrint2 ChannelPrint2 Same function as ChannelPrint2. PrinC PrinC ___ ___ ___ ___ ____ (PrinC ITM:any): ITM:any expr Prin2 Prin2 Same function as Prin2. ChannelPrint ChannelPrint ____ __ _______ _ ___ _ ___ ____ (ChannelPrint CHAN:io-channel U:any): U:any expr ChannelPrin1 _ ChannelPrin1 Display U using ChannelPrin1 and terminate line using ChannelTerpri ChannelTerpri ChannelTerpri. Print Print _ ___ _ ___ ____ (Print U:any): U:any expr ChannelPrint ChannelPrint _ ChannelPrint U to current output channel, OUT!*. PSL Manual 7 February 1983 Input and Output section 12.4 page 12.9 ChannelPrintF ChannelPrintF ____ __ _______ ______ ______ ____ ___ ___ ____ (ChannelPrintF CHAN:io-channel FORMAT:string [ARGS:any]): NIL expr ChannelPrintF ChannelPrintF ChannelPrintF is a simple routine for formatted printing, similar ______ to the function with the same name in the C language[22]. FORMAT ______ is either a LISP or SYSLISP string, which is printed on the currently selected output channel. However, if a % is ______ encountered in the string, the character following it is a formatting directive, used to interpret and print the other ChannelPrintF ChannelPrintF arguments to ChannelPrintF in order. The following format characters are currently supported: - For SYSLISP arguments, use: _______ %d print the next argument as a decimal integer _______ %o print the next argument as an octal integer _______ %x print the next argument as a hexadecimal integer %c print the next argument as a single character ______ %s print the next argument as a string - For LISP tagged items, use: %p print the next argument as a LISP item, using Prin1 Prin1 Prin1 %w print the next argument as a LISP item, using Prin2 Prin2 Prin2 %r print the next argument as a LISP item, using ErrPrin Prin2 Prin1 Prin2 ErrPrin Prin2 Prin1 Prin2 ErrPrin (Ordinarily Prin2 "`"; Prin1 Arg; Prin2 "'" ) %l same as %w, except lists are printed without top level parens; NIL is printed as a blank %e eval the next argument for side-effect -- most eval eval useful if the thing evaled does some printing - Control formats: %b take next argument as an integer and print that many blanks %f "fresh-line", print an end-of-line character if not at the beginning of the output line (does not use a matching argument) %n print end-of-line character (does not use a matching argument) %t take the next argument as an integer, and ChannelTab ChannelTab ChannelTab to that position Input and Output 7 February 1983 PSL Manual page 12.10 section 12.4 If the character following % is not either one of the above or another %, it causes an error. Thus, to include a % in the format to be printed, use %%. There is no checking for correspondence between the number of ______ arguments the FORMAT expects and the number given. If the number ______ given is less than the number in the FORMAT string, then garbage will be inserted for the missing arguments. If the number given ______ is greater than the number in the FORMAT string, then the extra ones are ignored. PrintF PrintF ______ ______ ____ ___ ___ ____ (PrintF FORMAT:string [ARGS:any]): NIL expr ChannelPrintF ChannelPrintF ChannelPrintF to the current output channel, OUT!*. ErrorPrintF ErrorPrintF ______ ______ ____ ___ ___ ____ (ErrorPrintF FORMAT:string [ARGS:any]): NIL expr ErrorPrintF PrintF ErrorPrintF PrintF ErrorPrintF is similar to PrintF, except that instead of using the currently selected output channel, ERROUT!* is used. Also, an end-of-line character is always printed after the message, and an end-of-line character is printed before the message if the line position of ERROUT!* is greater than zero. ChannelTerPri ChannelTerPri ____ __ _______ ___ ____ (ChannelTerPri CHAN:io-channel): NIL expr ____ Terminate OUTPUT line on channel CHAN, and reset the POSN counter to 0. TerPri TerPri ___ ____ (TerPri ): NIL expr Terminate current OUTPUT line, and reset the POSN counter to 0. ChannelEject ChannelEject ____ __ _______ ___ ____ (ChannelEject CHAN:io-channel): NIL expr ____ Skip to top of next output page on channel CHAN. Eject Eject ___ ____ (Eject ): NIL expr Skip to top of next output page on current output channel. ChannelPosn ChannelPosn ____ __ _______ _______ ____ (ChannelPosn CHAN:io-channel): integer expr Returns number of characters output on this line (i.e. POSN counter since last Terpri) on this channel. PSL Manual 7 February 1983 Input and Output section 12.4 page 12.11 Posn Posn _______ ____ (Posn ): integer expr Returns number of characters output on this line (i.e. POSN counter since last Terpri) ChannelLPosn ChannelLPosn ____ __ _______ _______ ____ (ChannelLPosn CHAN:io-channel): integer expr LPosn LPosn Returns number of lines output on this page (i.e. LPosn counter since last Eject) on this channel. LPosn LPosn _______ ____ (LPosn ): integer expr LPosn LPosn Returns number of lines output on this page (i.e. LPosn counter since last Eject). ChannelLineLength ChannelLineLength ____ __ _______ ___ _______ ___ _______ ____ (ChannelLineLength CHAN:io-channel LEN:{integer, NIL}): integer expr ____ _______ Set maximum output line length on CHAN if a positive integer, returning previous value. If NIL just return previous value. Terpri Terpri Controls the insertion of automatic Terpri's. LineLength LineLength ___ _______ ___ _______ ____ (LineLength LEN:{integer, NIL}): integer expr Set maximum output line length on current channel OUT!* if a _______ positive integer, returning previous value. If NIL just return Terpri Terpri previous value. Controls the insertion of automatic Terpri's. RPrint RPrint _ ____ ___ ____ (RPrint U:form): NIL expr Print in RLISP format. Autoloading. PrettyPrint PrettyPrint _ ____ _ ____ (PrettyPrint U:form): U expr _ Prettyprints U. Autoloading. Prin2L Prin2L _ ___ _ ____ (Prin2L L:any): L expr Prin2 Prin2 ____ Prin2, except that a list is printed without the top level parens. ChannelSpaces ChannelSpaces ____ __ _______ _ _______ ___ ____ (ChannelSpaces CHAN:io-channel N:integer): NIL expr ChannelPrin2 ChannelPrin2 _ _ ChannelPrin2 N spaces. Will continue across multiple lines if N is greater than the number of positions in the output buffer. Input and Output 7 February 1983 PSL Manual page 12.12 section 12.4 POSN LINELENGTH POSN LINELENGTH (See POSN and LINELENGTH) Spaces Spaces _ _______ ___ ____ (Spaces N:integer): NIL expr Prin2 Prin2 _ Prin2 N spaces. ChannelPrin2T ChannelPrin2T ____ __ _______ _ ___ ___ ____ (ChannelPrin2T CHAN:io-channel X:any): any expr ChannelPrin2 _ ChannelPrin2 Output X using ChannelPrin2 and terminate line with ChannelTerpri ChannelTerpri ChannelTerpri. Prin2T Prin2T _ ___ ___ ____ (Prin2T X:any): any expr ChannelPrin2T ChannelPrin2T _ ChannelPrin2T X to the current output channel, OUT!*. ChannelTab ChannelTab ____ __ _______ _ _______ ___ ____ (ChannelTab CHAN:io-channel N:integer): NIL expr _ ____ Move to position N on channel CHAN, emitting spaces as needed. ChannelTerPri ChannelTerPri _ Calls ChannelTerPri if past column N. Tab Tab _ _______ ___ ____ (Tab N:integer): NIL expr TerPri _ TerPri Move to position N, emitting spaces as needed. TerPri() if past _ column N. _________ __________ The fluid variables PRINLEVEL and PRINLENGTH allow the user to control how deep the printer will print and how many elements at a given level the printer will print. This is useful for debugging or dealing large or deep Prin1 Prin2 PrinC Print Prin1 Prin2 PrinC Print objects. These variables affect the functions Prin1, Prin2, PrinC, Print, PrintF PrintF and PrintF (and the corresponding Channel functions). The documentation of these variables is from the Common Lisp Manual. __________ ______ PRINLEVEL [Initially: Nil] global Controls how many levels deep a nested data object will print. _________ If PRINLEVEL is NIL, then no control is exercised. Otherwise the value should be an integer, indicating the maximum level to be printed. An object to be printed is at level 0. __________ ______ PRINLENGTH [Initially: Nil] global Controls how many elements at a given level are printed. A value of NIL indicates that there be no limit to the number of __________ components printed. Otherwise the value of PRINLENGTH should be an integer. PSL Manual 7 February 1983 Input and Output section 12.5 page 12.13 12.5. Functions for Reading 12.5. Functions for Reading 12.5. Functions for Reading 12.5.1. Reading S-Expression 12.5.1. Reading S-Expression 12.5.1. Reading S-Expression ChannelRead ChannelRead ____ __ _______ ___ ____ (ChannelRead CHAN:io-channel): any expr ____ Reads and returns the next S-expression from input channel CHAN. Valid input forms are: vector-notation, pair-notation, list- ______ ____ _______ ______ __________ notation, numbers, code-pointers, strings, and identifiers. Intern __________ Intern Identifiers are interned (see the Intern function in Chapter 6), ChannelRead ChannelRead unless the FLUID variable !*COMPRESSING is non-NIL. ChannelRead returns the value of the global variable !$EOF!$ when the end of the currently selected input channel is reached. ChannelRead ChannelReadToken ChannelRead ChannelReadToken ChannelRead uses the ChannelReadToken function, with tokens scanned according to the "Lisp scan table". The user can define similar read functions for use with other scan tables. ____ _____ ____ _____ ____ _____ ChannelRead Read macro ChannelRead Read macro ChannelRead uses the Read macro mechanism to do S-expression parsing. See section 12.5.5 for more information on read macros and how to add extensions. The following read macros are defined initially: ( Starts a scan collecting S-expressions according to ____ ____ list or dot notation until terminated by a ). A pair ____ or list is returned. [ Starts a scan collecting S-expressions according to ______ vector notation until terminated by a ]. A vector is returned. Read Read ' Calls Read to get an S-expression, x, and then returns Quote Quote the list (Quote x). !$EOF!$ Generates an error when still inside an S-expression: ***** Unexpected EOF while reading on channel . Otherwise !$EOF!$ is returned. Read Read ___ ____ (Read ): any expr Reads and returns an S-expression from the current input channel. ChannelRead ChannelRead That is, it does a ChannelRead(IN!*). Input and Output 7 February 1983 PSL Manual page 12.14 section 12.5 12.5.2. Reading Files into PSL 12.5.2. Reading Files into PSL 12.5.2. Reading Files into PSL The following procedures are used to read complete files into PSL, by Open Open first calling Open, and then looping until end of file. The effect is similar to what would happen if the file were typed into PSL. Recall that file names are strings, and therefore one needs string-quotes (") around file names. File names may be given using full system dependent file name conventions, including directories and sub-directories, "links" and "logical-device-names", as appropriate on the specific system. __________ ______ !*ECHO [Initially: Nil] switch ____ The switch !*ECHO is used to control the echoing of input. When (On Echo) is placed in an input file, the contents of the file Dskin Dskin are echoed on the standard output device. Dskin does not change ____ the value of !*ECHO, so one may say (On Echo) before calling Dskin Dskin Dskin, and the input will be echoed. DskIn DskIn _ ______ ____ ________ ____ (DskIn F:string): None Returned expr Read Eval Print Read Eval Print _ Enters a Read-Eval-Print loop on the contents of the file F. DskIn DskIn _ DskIn expects LISP syntax in the file F. Use the following format: (DskIn "File"). LapIn LapIn _ ______ ____ ________ ____ (LapIn U:string): None Returned expr Reads a single LISP file as "quietly" as possible, i.e., it does LapIn LapIn not echo or return values. Note that LapIn can be used only for LISP files. By convention, files with the extension ".LAP" are LapIn LapIn intended to be read by LapIn. These files are typically used to load modules made up of several binary (also known as FASL) Load Load files. The use of the Load function is normally preferable to LapIn LapIn using LapIn. For information about fast loading of files of Load FaslIn Load FaslIn compiled functions (FASL files) see FASL and the Load and FaslIn functions in Chapter 18. The following functions are present in RLISP, they can be used from Bare-PSL by loading RLISP. In In _ ______ ____ ________ _____ (In [L:string]): None Returned macro DskIn DskIn Similar to DskIn but expects RLISP syntax in the files it reads unless it can determine that the files are not in RLISP syntax. In In Also In can take more than one file name as an argument. On most In In systems the function In expects files with extension .LSP and .SL to be written in LISP syntax, not in RLISP. This is convenient when using both LISP and RLISP files. It is conventional to use the extension .RED (or .R) for RLISP files and use .LSP or .SL PSL Manual 7 February 1983 Input and Output section 12.5 page 12.15 only for fully parenthesized LISP files. There are some system programs, such as TAGS on the DEC-20, which expect RLISP files to have the extension .RED. If it is not desired to have the contents of the file echoed as In In it is read, either end the In command with a "$" in RLISP, as In "FILE1.RED","FILE2.SL"$ Off Off ____ or include the statement "Off ECHO;" in your file. PathIn PathIn ________ ____ ______ ____ ________ ____ (PathIn FileName-Tail:string): None Returned expr IN IN Allows the use of a directory search path with the Rlisp IN function. It finds a list of search paths in the fluid variable PATHIN!*. These are successively concatenated onto the front of PathIn PathIn the string argument to PathIn until an existing file is found FileP In FileP In (using FileP. If one is found, In will be invoked on this file. If not, a continuable error occurs. For example on the VAX, (Setq PathIn!* '( "" "/u/psl/" "/u/smith/")) (PathIn "foo.red") will attempt to open "foo.red", then "/u/psl/foo.red", and finally "/u/smith/foo.red" until a successful open is achieved. Pathin Pathin To use Pathin in Bare-PSL, load PATHIN as well as RLISP. EvIn EvIn _ ______ ____ ____ ________ ____ (EvIn L:string-list): None Returned expr EvIn _ EvIn L must be a list of strings that are filenames. EvIn is the In In In In function called by In after evaluating its arguments. In is EvIn EvIn useful only at the top-level, while EvIn can be used inside functions with file names passed as parameters. 12.5.3. Reading Single Characters 12.5.3. Reading Single Characters 12.5.3. Reading Single Characters ChannelReadChar ChannelReadChar _______ __ _______ _________ ____ (ChannelReadChar CHANNEL:io-channel): character expr _______ _______ Reads one character (an integer) from CHANNEL. All input is _______ defined in terms of this function. If CHANNEL is not open or is open for writing only, an error is generated. If there is a _______ non-zero value in the backup buffer associated with CHANNEL, the buffer is emptied (set to zero) and the value returned. _______ Otherwise, the reading function associated with CHANNEL is called _______ with CHANNEL as argument, and the value it returns is returned by ChannelReadChar ChannelReadChar ChannelReadChar. Input and Output 7 February 1983 PSL Manual page 12.16 section 12.5 ***** Channel not open ***** Channel open for write only ReadChar ReadChar _________ ____ (ReadChar ): character expr Reads one character from the current input channel. ChannelReadCH ChannelReadCH ____ __ _______ __ ____ (ChannelReadCH CHAN:io-channel): id expr ChannelReadChar ChannelReadChar __ Like ChannelReadChar, but returns the id for the character rather than its ASCII code. ReadCH ReadCH __ ____ (ReadCH ): id expr ChannelReadCH ChannelReadCH ChannelReadCH from the current input channel. ChannelUnReadChar ChannelUnReadChar ____ __ _______ __ _________ _________ ____ (ChannelUnReadChar CHAN:io-channel CH:character): Undefined expr __ The input backup function. CH is deposited in the backup buffer ____ associated with CHAN. This function should be only called after ChannelReadChar ChannelReadChar ChannelReadChar is called, before any intervening input operations, since it is used by the token scanner. UnReadChar UnReadChar __ _________ _________ ____ (UnReadChar CH:character): Undefined expr Backup on the current input channel. 12.5.4. Reading Tokens 12.5.4. Reading Tokens 12.5.4. Reading Tokens The functions described here pertain to the token scanner and reader. Globals and switches used by these functions are defined at the end of this section. ChannelReadToken ChannelReadToken _______ __ _______ __ ______ ______ ____ (ChannelReadToken CHANNEL:io-channel): {id, number, string} expr This is the basic LISP token scanner. The value returned is a LISP item corresponding to the next token from the input stream. __ Ids are interned, unless the FLUID variable !*COMPRESSING is non-NIL. The GLOBAL variable TOKTYPE!* is set to: __ 0 if the token is an ordinary id, ______ 1 if the token is a string, ______ 2 if the token is a number, or PSL Manual 7 February 1983 Input and Output section 12.5 page 12.17 3 if the token is an unescaped delimiter. __ In the last case, the value returned is the id whose print name is the same as the delimiter. The precise behavior of this function depends on two FLUID variables: CURRENTSCANTABLE!* ______ Is bound to a vector known as a scan table. Described below. CURRENTREADMACROINDICATOR!* __ Bound to an id known as a read macro indicator. Described below. Scan tables have 129 entries, indexed by 0 through 128. 0 _______ through 127 are indexed by ASCII character code to get an integer code determining the treatment of the corresponding character. _______ __ The last entry is not an integer, but rather an id which _________ _________ specifies a Diphthong Indicator for the token scanner. [??? A future implementation may replace the FLUID [??? A future implementation may replace the FLUID [??? A future implementation may replace the FLUID CURRENTREADMACROINDICATOR!* with another entry in the scan CURRENTREADMACROINDICATOR!* with another entry in the scan CURRENTREADMACROINDICATOR!* with another entry in the scan table. ???] table. ???] table. ???] The following encoding for characters is used. 0 ... 9 DIGIT: indicates the character is a digit, and gives the corresponding numeric value. 10 LETTER: indicates that the character is a letter. 11 DELIMITER: indicates that the character is a delimiter which is not the starting character of a diphthong. 12 COMMENT: indicates that the character begins a comment terminated by an end of line. 13 DIPHTHONG: indicates that the character is a delimiter which may be the starting character of a diphthong. (A diphthong is a two character sequence read as one token, i.e., "<<" or ":=".) 14 IDESCAPE: indicates that the character is an escape character, to cause the following character to be taken __ as part of an id. (Ordinarily an exclamation point, i.e. "!".) 15 STRINGQUOTE: indicates that the character is a string quote. (Ordinarily a double quote, i.e. '"'.) 16 PACKAGE: indicates that the character is used to introduce explicit package names. (Ordinarily "\".) 17 IGNORE: indicates that the character is to be ignored. Input and Output 7 February 1983 PSL Manual page 12.18 section 12.5 (Ordinarily BLANK, TAB, EOL and NULL.) 18 MINUS: indicates that the character is a minus sign. 19 PLUS: indicates that the character is a plus sign. 20 DECIMAL: indicates that the character is a decimal point. 21 IDSURROUND: indicates that the character is to act for identifiers as a string quote acts for strings. Although this is not used in the default scan table, the intended character for this function is a vertical bar, |.) System builders who wish to define their own parsers can bind an appropriate scan table to CURRENTSCANTABLE!* and then call ChannelReadToken ChannelReadTokenWithHooks ChannelReadToken ChannelReadTokenWithHooks ChannelReadToken or ChannelReadTokenWithHooks for lexical scanning. Utility functions for building scan tables are described in the next section. The following standards for scanning tokens are used. __ - Ids begin with a letter or any character preceded by an escape character. They may contain letters, digits and __ escaped characters. Ids may also start with a digit, if the first non-digit following is a plus sign, minus sign, or letter other than "b" or "e". This is to allow identifiers such as "1+" which occur in some LISPs. Finally, a string of characters bounded by the IDSURROUND character is treated __ as an id. If !*RAISE is non-NIL, unescaped lower case letters are __ folded to upper case. The maximum size of an id (or any other token) is currently 5000 characters. __________ Note: Using lower case letters in identifiers may cause portability problems. Lower case letters are automatically converted to upper case if the !*RAISE switch is T. This __ case conversion is done only for id input, not for single character or string input. [??? Can we retain input Case, but Compare RAISEd ???] [??? Can we retain input Case, but Compare RAISEd ???] [??? Can we retain input Case, but Compare RAISEd ???] Here are some examples, using the RLISP scan table. Note that the first and second examples are read as the same identifier if !*RAISE is T. The fourth and fifth examples are read as the same identifier. * ThisIsALongIdentifier * THISISALONGIDENTIFIER * ThisIsALongIdentifierAndDifferentFromTheOther * this_is_a_long_identifier_with_underscores PSL Manual 7 February 1983 Input and Output section 12.5 page 12.19 * this!_is!_a!_long!_identifier!_with!_underscores * an!-identifier!-with!-dashes * !*RAISE * !2222 The following examples show the same identifiers in a form accepted by the LISP scan table. Note that most characters are treated as letters by the LISP scan table, while they are treated as delimiters by the RLISP scan table. * ThisIsALongIdentifier * THISISALONGIDENTIFIER * ThisIsALongIdentifierAndDifferentFromTheOther * this_is_a_long_identifier_with_underscores * this!_is!_a!_long!_identifier!_with!_underscores * an-identifier-with-dashes * *RAISE * !2222 ______ - Strings begin with a double quote (") and include all characters up to a closing double quote. A double quote can ______ ______ be included in a string by doubling it. An empty string, consisting of only the enclosing quote marks, is allowed. ______ The characters of a string are not affected by the value of the !*RAISE. Examples: * "This is a string" * "This is a ""string""" * "" ____ _______ - Code-pointers cannot be read directly, but can be printed and constructed. Currently printed as ________ _____ _____ _______ #<Code argument-count octal-address>. _______ - Integers begin with a digit, optionally preceded by a + or - sign, and consist only of digits. The GLOBAL input radix is 10; there is no way to change this. However, numbers of different radices may be read by the following convention. A decimal number from 2 to 36 followed by a sharp sign (#), causes the digits (and possibly letters) that follow to be 2 read in the radix of the number preceding the #. Thus 63 _______________ 2 Octal numbers can also be written as a string of digits followed by the letter "B". This "feature" may be removed in the future. Input and Output 7 February 1983 PSL Manual page 12.20 section 12.5 may be entered as 8#77, or 255 as 16#ff or 16#FF. The output radix can be changed, by setting OUTPUTBASE!*. If _______ OutPutBase!* is not 10, the printed integer appears with appropriate radix. Leading zeros are suppressed and a minus _______ sign precedes the digits if the integer is negative. Examples: * 100 * +5234 * -8#44 (equal to -36) [??? Should we permit trailing . in integers for [??? Should we permit trailing . in integers for [??? Should we permit trailing . in integers for compatibility with some LISPs and require digits on each compatibility with some LISPs and require digits on each compatibility with some LISPs and require digits on each side of . for floats ???] side of . for floats ???] side of . for floats ???] _____ - Floats have a period and/or a letter "e" or "E" in them. _____ Any of the following are read as floats. The value appears in the format [-]n.nn...nnE[-]mm if the magnitude of the number is too large or small to display in [-]nnnn.nnnn format. The crossover point is determined by the _____ implementation. In BNF, floats are recognized by the grammar: <base> ::= <unsigned-integer>.| .<unsigned-integer>| <unsigned-integer>.<unsigned-integer> <ebase> ::= <base>|<unsigned-integer> <unsigned-float> ::= <base>| <ebase>e<unsigned-integer>| <ebase>e-<unsigned-integer>| <ebase>e+<unsigned-integer>| <ebase>E<unsigned-integer>| <ebase>E-<unsigned-integer>| <ebase>E+<unsigned-integer> <float> ::= <unsigned-float>| +<unsigned-float>| -<unsigned-float> That is: * [+|-][nnn][.]nnn{e|E}[+|-]nnn * nnn. * .nnn * nnn.nnn Examples: PSL Manual 7 February 1983 Input and Output section 12.5 page 12.21 * 1e6 * .2 * 2. * 2.0 * -1.25E-9 RAtom RAtom __ ______ ______ ____ (RAtom ): {id, number, string} expr Reads a token from the current input channel. (Not called ReadToken ReadToken ReadToken for historical reasons.) [??? Should we bind CurrentScanTable!* for this function too [??? Should we bind CurrentScanTable!* for this function too [??? Should we bind CurrentScanTable!* for this function too ???] ???] ???] __________ ______ !*COMPRESSING [Initially: NIL] switch ChannelReadToken ChannelReadToken If !*COMPRESSING is non-NIL, ChannelReadToken does not intern __ ids. __________ ______ !*EOLINSTRINGOK [Initially: NIL] switch If !*EOLINSTRINGOK is non-NIL, the warning message *** STRING CONTINUED OVER END-OF-LINE is suppressed. __________ ______ !*RAISE [Initially: T] switch __ If !*RAISE is non-NIL, all characters input for ids through PSL input functions are raised to upper case. If !*RAISE is NIL, ______ characters are input as is. A string is unaffected by !*RAISE. __________ ______ CURRENTSCANTABLE!* [Initially: ] global Read Read This variable is set to LISPSCANTABLE!* by the Read function (the "Lisp syntax" reader). The RLISP reader sets it to RLISPSCANTABLE!* or LISPSCANTABLE!* depending on the syntax it expects. Input and Output 7 February 1983 PSL Manual page 12.22 section 12.5 __________ ______ LISPSCANTABLE!* [Initially: as shown in following table] global 0 ^@ IGNORE 32 IGNORE 64 @ LETTER 96 ` DELIMITER 1 ^A LETTER 33 ! IDESCAPECHAR 65 A LETTER 97 a LETTER 2 ^B LETTER 34 " STRINGQUOTE 66 B LETTER 98 b LETTER 3 ^C LETTER 35 # LETTER 67 C LETTER 99 c LETTER 4 ^D LETTER 36 $ LETTER 68 D LETTER 100 d LETTER 5 ^E LETTER 37 % COMMENTCHAR 69 E LETTER 101 e LETTER 6 ^F LETTER 38 & LETTER 70 F LETTER 102 f LETTER 7 ^G LETTER 39 ' DELIMITER 71 G LETTER 103 g LETTER 8 ^H LETTER 40 ( DELIMITER 72 H LETTER 104 h LETTER 9 <tab> IGNORE 41 ) DELIMITER 73 I LETTER 105 i LETTER 10 <lf> IGNORE 42 * LETTER 74 J LETTER 106 j LETTER 11 ^K LETTER 43 + PLUSSIGN 75 K LETTER 107 k LETTER 12 ^L IGNORE 44 , DIPHTHONGSTART 76 L LETTER 108 l LETTER 13 <cr> IGNORE 45 - MINUSSIGN 77 M LETTER 109 m LETTER 14 ^N LETTER 46 . DECIMALPOINT 78 N LETTER 110 n LETTER 15 ^O LETTER 47 / LETTER 79 O LETTER 111 o LETTER 16 ^P LETTER 48 0 DIGIT 80 P LETTER 112 p LETTER 17 ^Q LETTER 49 1 DIGIT 81 Q LETTER 113 q LETTER 18 ^R LETTER 50 2 DIGIT 82 R LETTER 114 r LETTER 19 ^S LETTER 51 3 DIGIT 83 S LETTER 115 s LETTER 20 ^T LETTER 52 4 DIGIT 84 T LETTER 116 t LETTER 21 ^U LETTER 53 5 DIGIT 85 U LETTER 117 u LETTER 22 ^V LETTER 54 6 DIGIT 86 V LETTER 118 v LETTER 23 ^W LETTER 55 7 DIGIT 87 W LETTER 119 w LETTER 24 ^X LETTER 56 8 DIGIT 88 X LETTER 120 x LETTER 25 ^Y LETTER 57 9 DIGIT 89 Y LETTER 121 y LETTER 26 ^Z DELIMITER 58 : LETTER 90 Z LETTER 122 z LETTER 27 $ LETTER 59 ; LETTER 91 [ DELIMITER 123 { LETTER 28 ^\ LETTER 60 < LETTER 92 \ PACKAGE 124 | LETTER 29 ^] LETTER 61 = LETTER 93 ] DELIMITER 125 } LETTER 30 ^^ LETTER 62 > LETTER 94 ^ LETTER 126 ~ LETTER 31 ^_ LETTER 63 ? LETTER 95 _ LETTER 127 <rubout> LETTER _________ _________ The Diphthong Indicator in the 128th entry is the identifier LISPDIPTHONG. [??? Note that LISPDIPTHONG should be spelled LISPDIPHTHONG, this will [??? Note that LISPDIPTHONG should be spelled LISPDIPHTHONG, this will [??? Note that LISPDIPTHONG should be spelled LISPDIPHTHONG, this will probably be corrected in the future. ???] probably be corrected in the future. ???] probably be corrected in the future. ???] PSL Manual 7 February 1983 Input and Output section 12.5 page 12.23 __________ ______ RLISPSCANTABLE!* [Initially: as shown in following table] global 0 ^@ IGNORE 32 IGNORE 64 @ DELIMITER 96 ` DELIMITER 1 ^A DELIMITER 33 ! IDESCAPECHAR 65 A LETTER 97 a LETTER 2 ^B DELIMITER 34 " STRINGQUOTE 66 B LETTER 98 b LETTER 3 ^C DELIMITER 35 # DELIMITER 67 C LETTER 99 c LETTER 4 ^D DELIMITER 36 $ DELIMITER 68 D LETTER 100 d LETTER 5 ^E DELIMITER 37 % COMMENTCHAR 69 E LETTER 101 e LETTER 6 ^F DELIMITER 38 & DELIMITER 70 F LETTER 102 f LETTER 7 ^G DELIMITER 39 ' DELIMITER 71 G LETTER 103 g LETTER 8 ^H DELIMITER 40 ( DELIMITER 72 H LETTER 104 h LETTER 9 <tab> IGNORE 41 ) DELIMITER 73 I LETTER 105 i LETTER 10 <lf> IGNORE 42 * DIPHTHONGSTART 74 J LETTER 106 j LETTER 11 ^K DELIMITER 43 + DELIMITER 75 K LETTER 107 k LETTER 12 ^L IGNORE 44 , DELIMITER 76 L LETTER 108 l LETTER 13 <cr> IGNORE 45 - DELIMITER 77 M LETTER 109 m LETTER 14 ^N DELIMITER 46 . DECIMALPOINT 78 N LETTER 110 n LETTER 15 ^O DELIMITER 47 / DELIMITER 79 O LETTER 111 o LETTER 16 ^P DELIMITER 48 0 DIGIT 80 P LETTER 112 p LETTER 17 ^Q DELIMITER 49 1 DIGIT 81 Q LETTER 113 q LETTER 18 ^R DELIMITER 50 2 DIGIT 82 R LETTER 114 r LETTER 19 ^S DELIMITER 51 3 DIGIT 83 S LETTER 115 s LETTER 20 ^T DELIMITER 52 4 DIGIT 84 T LETTER 116 t LETTER 21 ^U DELIMITER 53 5 DIGIT 85 U LETTER 117 u LETTER 22 ^V DELIMITER 54 6 DIGIT 86 V LETTER 118 v LETTER 23 ^W DELIMITER 55 7 DIGIT 87 W LETTER 119 w LETTER 24 ^X DELIMITER 56 8 DIGIT 88 X LETTER 120 x LETTER 25 ^Y DELIMITER 57 9 DIGIT 89 Y LETTER 121 y LETTER 26 ^Z DELIMITER 58 : DIPHTHONGSTART 90 Z LETTER 122 z LETTER 27 $ DELIMITER 59 ; DELIMITER 91 [ DELIMITER 123 { DELIMITER 28 ^\ DELIMITER 60 < DIPHTHONGSTART 92 \ PACKAGE 124 | DELIMITER 29 ^] DELIMITER 61 = DELIMITER 93 ] DELIMITER 125 } DELIMITER 30 ^^ DELIMITER 62 > DIPHTHONGSTART 94 ^ DELIMITER 126 ~ DELIMITER 31 ^_ DELIMITER 63 ? DELIMITER 95 _ LETTER 127 <rubout> DELIMITER _________ _________ The Diphthong Indicator in the 128th entry is the identifier RLISPDIPTHONG. [??? Note that RLISPDIPTHONG should be spelled RLISPDIPHTHONG, this [??? Note that RLISPDIPTHONG should be spelled RLISPDIPHTHONG, this [??? Note that RLISPDIPTHONG should be spelled RLISPDIPHTHONG, this will probably be corrected in the future. ???] will probably be corrected in the future. ???] will probably be corrected in the future. ???] [??? What about the RlispRead scantable ???] [??? What about the RlispRead scantable ???] [??? What about the RlispRead scantable ???] [??? Perhaps describe one basic table, and changes from one to other, [??? Perhaps describe one basic table, and changes from one to other, [??? Perhaps describe one basic table, and changes from one to other, since mostly the same ???] since mostly the same ???] since mostly the same ???] Input and Output 7 February 1983 PSL Manual page 12.24 section 12.5 __________ ______ OUTPUTBASE!* [Initially: 10] global This global can be set to control the radix in which integers are printed out. If the radix is not 10, the radix is given before a sharp sign, e.g. 8#20 is"20" in base 8, or 16. __________ ______ TOKTYPE!* [Initially: 3] global ChannelReadToken ChannelReadToken ChannelReadToken sets TOKTYPE!* to: __ 0 if the token is an ordinary id, ______ 1 if the token is a string, ______ 2 if the token is a number, or 3 if the token is an unescaped delimiter. __ In the last case, the value returned is the id whose print name is the same as the delimiter. 12.5.5. Read Macros 12.5.5. Read Macros 12.5.5. Read Macros Channel Token Channel Token A function of two arguments (Channel, Token) can be associated with any DELIMITER or DIPHTHONG token (i.e. those that have TOKTYPE!*=3) by calling PutReadMacro ChannelReadTokenWithHooks PutReadMacro _________ ChannelReadTokenWithHooks PutReadMacro. A ReadMacro function is called by ChannelReadTokenWithHooks ChannelReadToken ChannelReadToken if the appropriate token with TOKTYPE!*=3 is returned by ChannelReadToken. This function can then take over the reading (or scanning) process, finally returning a token (actually an S-expression) to be returned in place of the token itself. Quote Quote Example: The quote mark, 'x converting to (Quote x), is done by the PutReadMacro PutReadMacro following example which makes use of the function PutReadMacro which is defined in Section 12.6. In LISP: (de DOQUOTE (CHANNEL TOKEN)) (LIST 'QUOTE (CHANNELREAD CHANNEL)) (PUTREADMACRO LISPSCANTABLE!* '!' (FUNCTION DOQUOTE)) _________ A ReadMacro is installed on the property list of the macro-character as a function under the indicators 'LISPREADMACRO, 'RLISPREADMACRO, etc. A _________ Diphthong is installed on the property list of the first character as (second-character . diphthong) under the indicators 'LISPDIPHTHONG, 'RLISPDIPHTHONG, etc. PSL Manual 7 February 1983 Input and Output section 12.6 page 12.25 12.6. Scan Table Utility Functions 12.6. Scan Table Utility Functions 12.6. Scan Table Utility Functions The following functions are provided to manage scan tables, in the READ-UTILS module (use via LOAD READ-UTILS): PrintScanTable PrintScanTable _____ ______ ___ ____ (PrintScanTable TABLE:vector): NIL expr Prints the entire scantable, gives the 0 ... 127 entries with the name of the character class. Also prints the indicator used for diphthongs. [??? Make smarter, reduce output, use nice names for control [??? Make smarter, reduce output, use nice names for control [??? Make smarter, reduce output, use nice names for control characters, ala EMODE. ???] characters, ala EMODE. ???] characters, ala EMODE. ???] CopyScanTable CopyScanTable ________ ______ ___ ______ ____ (CopyScanTable OLDTABLE:{vector, NIL}): vector expr Copies the existing scantable (or CURRENTSCANTABLE!* if given GenSym GenSym NIL). Currently GenSym()'s the indicators used for diphthongs. [??? Change when we use Property Lists in extra slots of the [??? Change when we use Property Lists in extra slots of the [??? Change when we use Property Lists in extra slots of the Scan-Table ???] Scan-Table ???] Scan-Table ???] PutDipthong PutDipthong _____ ______ __ __ ___ __ ___ __ ___ ____ (PutDipthong TABLE:vector, D1:id ID2:id DIP:id): NIL expr ___ ___ ___ Installs DIP as the name of the diphthong ID1 followed by ID2 in the given scan table. [??? Note that PutDipthong should be spelled PutDiphthong, [??? Note that PutDipthong should be spelled PutDiphthong, [??? Note that PutDipthong should be spelled PutDiphthong, this will probably be corrected in the future. ???] this will probably be corrected in the future. ???] this will probably be corrected in the future. ???] PutReadMacro PutReadMacro _____ ______ ___ __ _____ __ ___ ____ (PutReadMacro TABLE:vector ID1:id FNAME:id): NIL expr ____ _____ ____ _____ ____ _____ Read macro _____ Read macro Installs FNAME as the name of the Read macro function for the ___ ___ ___ [not ___ [not delimiter or diphthong ID1 in the given scan table. [not ___________ ___ ___________ ___ ___________ ___ implemented yet] implemented yet] implemented yet] 12.7. I/O to and from Lists and Strings 12.7. I/O to and from Lists and Strings 12.7. I/O to and from Lists and Strings Digit Digit _ ___ _______ ____ (Digit U:any): boolean expr _ Returns T if U is a digit, otherwise NIL. Effectively this is: (de DIGIT (U) (IF (MEMQ U '(!0 !1 !2 !3 !4 !5 !6 !7 !8 !9)) T NIL)) Input and Output 7 February 1983 PSL Manual page 12.26 section 12.7 Liter Liter _ ___ _______ ____ (Liter U:any): boolean expr _ Returns T if U is a character of the alphabet, NIL otherwise. This is effectively: (de LITER(U) (IF (MEMQ U '(A B C D E F G H I J K L M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n o p q r s t u v w x y z)) T NIL)) Explode Explode _ ___ __ ____ ____ (Explode U:any): id-list expr Explode Explode Explode takes the constituent characters of an S-expression and ____ __ forms a list of single character ids. It is implemented via the ChannelPrin1 ChannelPrin1 ____ function ChannelPrin1, with a list rather than a file or terminal ____ as destination. Returned is a list of interned characters _ representing the characters required to print the value of U. Example: - Explode 'FOO; => (F O O) - Explode '(A . B); => (!( A ! !. ! B !)) [??? add print macros. cf. UCI lisp ???] [??? add print macros. cf. UCI lisp ???] [??? add print macros. cf. UCI lisp ???] Explode2 Explode2 _ ____ ______ __ ____ ____ (Explode2 U:{atom}-{vector}): id-list expr Prin2 Explode Prin2 Explode Prin2 version of Explode. Compress Compress _ __ ____ ____ ______ ____ (Compress U:id-list): {atom}-{vector} expr _ ____ U is a list of single character identifiers which is built into a ______ ______ PSL entity and returned. Recognized are numbers, strings, and __________ identifiers with the escape character prefixing special characters. The formats of these items appear in the "Primitive __________ ___ Data Types" Section, Section 4.1.2. Identifiers are not interned ________ _______ on the ID-HASH-TABLE. Function pointers may not be compressed. _ If an entity cannot be parsed out of U or characters are left over after parsing an error occurs: ***** Poorly formed atom in COMPRESS PSL Manual 7 February 1983 Input and Output section 12.7 page 12.27 Implode Implode _ __ ____ ____ ____ (Implode U:id-list): atom expr Compress Compress __ Compress with ids interned. FlatSize FlatSize _ ___ _______ ____ (FlatSize U:any): integer expr Prin1 Prin1 Character length of Prin1 S-expression. FlatSize2 FlatSize2 _ ___ _______ ____ (FlatSize2 U:any): integer expr Prin2 flatsize Prin2 flatsize Prin2 version of flatsize. BldMsg BldMsg ______ ______ ____ ___ ______ ____ (BldMsg FORMAT:string, [ARGS:any]): string expr PrintF BldMsg PrintF ______ BldMsg ______ PrintF to string. BldMsg returns a string stating that the ______ string could not be constructed if overflow occurs. 12.8. Example of Simple I/O in PSL 12.8. Example of Simple I/O in PSL 12.8. Example of Simple I/O in PSL In the following example a list of S-expressions is read, one expression at a time, from a file STUFF.IN and is written to a file STUFF.OUT. Following is the contents of STUFF.IN: (r e d) (a b c) (1 2 3 4) "ho ho ho" 6.78 5000 xyz The following shows the execution of the function TRYIO. Input and Output 7 February 1983 PSL Manual page 12.28 section 12.8 @psl:psl PSL 3.1, 15-Nov-82 1 lisp> (On Echo) NIL 2 lisp> (Dskin "Exampio.Sl") (De Tryio (Fil1 Fil2) (Prog (Oldin Oldout Exp) (Setq Oldin (Rds (Open Fil1 'input))) (Setq Oldout (Wrs (Open Fil2 'output))) (While (Neq (Setq Exp (Read)) !$EOF!$) (Print Exp)) (Close (Rds Oldin)) (Close (Wrs Oldout)))) TRYIO NIL 3 lisp> (Off Echo) NIL 4 lisp> (Tryio "Stuff.In" "Stuff.Out") NIL The output file STUFF.OUT contains the following. (R E D) (A B C) (1 2 3 4) "ho ho ho" 6.78 5000 XYZ