1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455245624572458245924602461246224632464246524662467246824692470247124722473247424752476247724782479248024812482248324842485248624872488248924902491249224932494249524962497249824992500250125022503250425052506250725082509251025112512251325142515251625172518251925202521252225232524252525262527252825292530253125322533253425352536253725382539254025412542254325442545254625472548254925502551255225532554255525562557255825592560256125622563256425652566256725682569257025712572257325742575257625772578257925802581258225832584258525862587258825892590259125922593259425952596259725982599260026012602260326042605260626072608260926102611261226132614261526162617261826192620262126222623262426252626262726282629263026312632263326342635263626372638263926402641264226432644264526462647264826492650265126522653265426552656265726582659266026612662266326642665266626672668266926702671267226732674267526762677267826792680268126822683268426852686268726882689269026912692269326942695269626972698269927002701270227032704270527062707270827092710271127122713271427152716271727182719272027212722272327242725272627272728272927302731273227332734273527362737273827392740274127422743274427452746274727482749275027512752275327542755275627572758275927602761276227632764276527662767276827692770277127722773277427752776277727782779278027812782278327842785278627872788278927902791279227932794279527962797279827992800280128022803280428052806280728082809281028112812281328142815281628172818281928202821282228232824282528262827282828292830283128322833283428352836283728382839284028412842284328442845284628472848284928502851285228532854285528562857285828592860286128622863286428652866286728682869287028712872287328742875287628772878287928802881288228832884 |
- UCP-60 January 1978
- First Revision - August 1978
- STANDARD LISP REPORT
- J. B. Marti
- A. C. Hearn
- M. L. Griss
- C. Griss
- University of Utah
- Salt Lake City, UT 84112
- UUCS-78-101
- ABSTRACT: A description of Standard LISP primitive
- data structures and functions is presented.
- Work supported in part by the National Science Foundation under Grant
- No. MCS76-15035 and by the Burroughs Corporation.
- Standard LISP Report. 1
- 1. Introduction.
- 1. Introduction.
- Although the programming language LISP was first formulated in
- 1960 [6], a widely accepted standard has never appeared. As a result,
- various dialects of LISP have been produced [4-12], in some cases
- several on the same machine! Consequently, a user often faces
- considerable difficulty in moving programs from one system to
- another. In addition, it is difficult to write and use programs which
- depend on the structure of the source code such as translators,
- editors and cross-reference programs.
- In 1969, a model for such a standard was produced [2] as part of
- a general effort to make a large LISP based algebraic manipulation
- program, REDUCE [3], as portable as possible. The goal of this work
- was to define a uniform subset of LISP 1.5 and its variants so that
- programs written in this subset could run on any reasonable LISP
- system.
- In the intervening years, two deficiencies in the approach taken
- in Ref. [2] have emerged. First in order to be as general as
- possible, the specific semantics and values of several key functions
- were left undefined. Consequently, programs built on this subset
- could not make any assumptions about the form of the values of such
- functions. The second deficiency related to the proposed method of
- implementation of this language. The model considered in effect two
- versions of LISP on any given machine, namely Standard LISP and the
- LISP of the host machine (which we shall refer to as Target LISP).
- This meant that if any definition was stored in interpretive form, it
- would vary from implementation to implementation, and consequently
- one could not write programs in Standard LISP which needed to assume
- any knowledge about the structure of such forms. This deficiency
- became apparent during recent work on the development of a portable
- compiler for LISP [1]. Clearly a compiler has to know precisely the
- structure of its source code; we concluded that the appropriate
- source was Standard LISP and not Target LISP.
- With these thoughts in mind we decided to attempt again a
- definition of Standard LISP. However, our approach this time is more
- aggressive. In this document we define a standard for a reasonably
- large subset of LISP with as precise as possible a statement about
- the semantics of each function. Secondly, we now require that the
- target machine interpreter be modified or written to support this
- standard, rather than mapping Standard LISP onto Target LISP as
- previously.
- We have spent countless hours in discussion over many of the
- definitions given in this report. We have also drawn on the help and
- advice of a lot of friends whose names are given in the
- Acknowledgements. Wherever possible, we have used the definition of a
- function as given in the LISP 1.5 Programmer's Manual [6] and have
- only deviated where we felt it desirable in the light of LISP
- programming experience since that time. In particular, we have given
- Standard LISP Report. 2
- 1. Introduction.
- considerable thought to the question of variable bindings and the
- definition of the evaluator functions EVAL and APPLY. We have also
- abandoned the previous definition of LISP arrays in favor of the more
- accepted idea of a vector which most modern LISP systems support.
- These are the places where we have strayed furthest from the
- conventional definitions, but we feel that the consistency which
- results from our approach is worth the redefinition.
- We have avoided entirely in this report problems which arise
- from environment passing, such as those represented by the FUNARG
- problem. We do not necessarily exclude these considerations from our
- standard, but in this report have decided to avoid the controversy
- which they create. The semantic differences between compiled and
- interpreted functions is the topic of another paper [1]. Only
- functions which affect the compiler in a general way make reference
- to it.
- This document is not intended as an introduction to LISP rather
- it is assumed that the reader is already familiar with some version.
- The document is thus intended as an arbiter of the syntax and
- semantics of Standard LISP. However, since it is not intended as an
- implementation description, we deliberately leave unspecified many of
- the details on which an actual implementation depends. For example,
- while we assume the existence of a symbol table for atoms (the
- "object list" in LISP terminology), we do not specify its structure,
- since conventional LISP programming does not require this
- information. Our ultimate goal, however, is to remedy this by
- defining an interpreter for Standard LISP which is sufficiently
- complete that its implementation on any given computer will be
- straightforward and precise. At that time, we shall produce an
- implementation level specification for Standard LISP which will
- extend the description of the primitive functions defined herein by
- introducing a new set of lower level primitive functions in which the
- structure of the symbol table, heap and so on may be defined.
- The plan of this paper is as follows. In Section 2 we describe
- the various data types used in Standard LISP. In Section 3, a
- description of all Standard LISP functions is presented, organized by
- type. These functions are defined in an ALGOL-like syntax which is
- easier to read than LISP S-expressions. Section 4 describes global
- variables which control the operation of Standard LISP. For
- completeness, a formal translation of the extended syntax to Standard
- LISP is given in Appendix A. In Appendix B is an alphabetical list of
- all defined LISP functions and their arguments and types for easy
- reference. A complete index of all functions and concepts concludes
- the report.
- Standard LISP Report. 3
- 2. Preliminaries.
- 2.1 Primitive Data Types.
- integer - Integers are also called "fixed" numbers. The magnitude of
- an integer is unrestricted. Integers in the LISP input stream are
- recognized by the grammar:
- <digit> ::= 0|1|2|3|4|5|6|7|8|9
- <unsigned-integer> ::= <digit>|<unsigned-integer><digit>
- <integer> ::= <unsigned-integer> |
- +<unsigned-integer> |
- -<unsigned-integer>
- floating - Any floating point number. The precision of floating point
- numbers is determined solely by the implementation. In BNF
- floating point numbers are recognized by the grammar:
- <base> ::= <unsigned-integer>.|.<unsigned-integer>|
- <unsigned-integer>.<unsigned-integer>
- <unsigned-floating> ::= <base>|
- <base>E<unsigned-integer>|
- <base>E-<unsigned-integer>|
- <base>E+<unsigned-integer>
- <floating> ::= <unsigned-floating>|
- +<unsigned-floating>|-<unsigned-floating>
- id - An identifier is a string of characters which may have the
- following items associated with it.
- print name - The characters of the identifier.
- flags - An identifier may be tagged with a flag. Access is by the
- FLAG, REMFLAG, and FLAGP functions defined in the "Property
- List Functions" section.
- properties - An identifier may have an indicator-value pair
- associated with it. Access is by the PUT, GET, and REMPROP
- functions defined in the "Property List Functions" section.
- values/functions - An identifier may have a value associated with
- it. Access to values is by SET and SETQ defined in the
- "Variables and Bindings" section. The method by which the value
- is attached to the identifier is known as the binding type,
- being one of LOCAL, GLOBAL, or FLUID. Access to the binding
- type is by the GLOBAL, GLOBALP, FLUID, FLUIDP, and UNFLUID
- functions.
- An identifier may have a function or macro associated with
- it. Access is by the PUTD, GETD, and REMD functions defined in
- the "Function Definition" section. An identifier may not have
- both a function and a value associated with it.
- OBLIST entry - An identifier may be entered and removed from a
- Standard LISP Report. 4
- 2. Preliminaries.
- structure called the OBLIST. Its presence on the OBLIST does
- not directly affect the other properties. Access to the OBLIST
- is by INTERN, REMOB, and READ defined in the "Identifiers" and
- "Input and Output" sections.
- The maximum length of a Standard LISP identifier is 24 characters
- (excluding occurrences of the escape character !) but an
- implementation may allow more. Special characters (digits in the
- first position and punctuation) must be prefixed with an escape
- character, an ! in Standard LISP. In BNF identifiers are
- recognized by the grammar:
- <special-character> ::= !<any-character>
- <alphabetic> ::=
- 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
- <lead-character> ::= <special-character>|<alphabetic>
- <regular-character> ::= <lead-character>|<digit>
- <last-part> ::= <regular-character>|
- <last-part><regular-character>
- <id> ::= <lead-character>|<lead-character><last-part>
- Note: Using lower case letters in identifiers may cause
- portability problems. Lower case letters are automatically
- converted to upper case when the !*RAISE flag is T. See the
- "System GLOBAL Variables" section.
- string - A set of characters enclosed in double quotes as in "THIS IS
- A STRING". A quote is included by doubling it as in "HE SAID,
- ""LISP""". The maximum size of strings is 80 characters but an
- implementation may allow more. Strings are not part of the OBLIST
- and are considered constants like numbers, vectors, and
- function-pointers.
- dotted-pair - A primitive structure which has a left and right part.
- A notation called dot-notation is used for dotted pairs and takes
- the form:
- (<left-part> . <right-part>)
- The <left-part> is known as the CAR portion and the <right-part>
- as the CDR portion. The left and right parts may be of any type.
- Spaces are used to resolve ambiguity with floating point numbers.
- vector - A primitive uniform structure in which an integer index is
- used to access random values in the structure. The individual
- elements of a vector may be of any type. Access to vectors is
- restricted to functions defined in the "Vectors" section. A
- notation for vectors, vector-notation, has the elements of a
- vector separated by commas and surrounded by square brackets.
- Standard LISP Report. 5
- 2. Preliminaries.
- <elements> ::= <any>|<any>, <elements>
- <vector> ::= [<elements>]
- function-pointer - An implementation may have functions which deal
- with specific data types other than those listed. The use of these
- entities is to be avoided with the exception of a restricted use
- of the function-pointer, an access method to compiled EXPRs and
- FEXPRs. A particular function-pointer must remain valid throughout
- execution. Systems which change the location of a function must
- use either an indirect reference or change all occurrences of the
- associated value. There are two classes of use of
- function-pointers, those which are supported by Standard LISP but
- are not well defined, and those which are well defined.
- Not well defined - Function pointers may be displayed by the print
- functions or expanded by EXPLODE. The value appears in the
- convention of the implementation site. The value is not defined
- in Standard LISP. Function pointers may be created by COMPRESS
- in the format used for printing but the value used is not
- defined in Standard LISP. Function pointers may be created by
- functions which deal with compiled function loading. Again, the
- values created are not well defined in Standard LISP.
- Well defined - The function pointer associated with a EXPR or
- FEXPR may be retrieved by GETD and is valid as long as Standard
- LISP is in execution. Function pointers may be stored using
- PUTD, PUT, SETQ and the like or by being bound to variables.
- Function pointers may be checked for equivalence by EQ. The
- value may be checked for being a function pointer by the CODEP
- function.
- 2.2 Classes of Primitive Data Types.
- The classes of primitive types are a notational convenience for
- describing the properties of functions.
- boolean - The set of global variables {T,NIL}, or their respective
- values, {T, NIL}. (see the "System GLOBAL Variables" section).
- extra-boolean - Any value in the system. Anything that is not NIL has
- the boolean interpretation T.
- ftype - The class of definable function types. The set of ids {EXPR,
- FEXPR, MACRO}.
- number - The set of {integer, floating}.
- Standard LISP Report. 6
- 2. Preliminaries.
- constant - The set of {integer, floating, string, vector,
- function-pointer}. Constants evaluate to themselves (see the
- definition of EVAL in "The Interpreter" section).
- any - The set of {integer, floating, string, id, dotted-pair, vector,
- function-pointer}. An S-expression is another term for any. All
- Standard LISP entities have some value unless an ERROR occurs
- during evaluation.
- atom - The set {any}-{dotted-pair}.
- 2.3 Structures.
- Structures are entities created out of the primitive types by
- the use of dotted-pairs. Lists are structures very commonly required
- as actual parameters to functions. Where a list of homogeneous
- entities is required by a function this class will be denoted by
- xxx-list where xxx is the name of a class of primitives or
- structures. Thus a list of ids is an id-list, a list of integers an
- integer-list and so on.
- list - A list is recursively defined as NIL or the dotted-pair (any .
- list). A special notation called list-notation is used to
- represent lists. List-notation eliminates extra parentheses and
- dots. The list (a . (b . (c . NIL))) in list notation is (a b c).
- List-notation and dot-notation may be mixed as in (a b . c) or (a
- (b . c) d) which are (a . (b . c)) and (a . ((b . c) . (d .
- NIL))). In BNF lists are recognized by the grammar:
- <left-part> ::= ( | <left-part> <any>
- <list> ::= <left-part>) | <left-part> . <any>)
- Note: () is an alternate input representation of NIL.
- alist - An association list; each element of the list is a
- dotted-pair, the CAR part being a key associated with the value in
- the CDR part.
- cond-form - A cond-form is a list of 2 element lists of the form:
- (ANTECEDENT:any CONSEQUENT:any)
- The first element will henceforth be known as the antecedent and
- the second as the consequent. The antecedent must have a value.
- The consequent may have a value or an occurrence of GO or RETURN
- as described in the "Program Feature Functions" section.
- Standard LISP Report. 7
- 2. Preliminaries.
- lambda - A LAMBDA expression which must have the form (in list
- notation): (LAMBDA parameters body). "parameters" is a list of
- formal parameters for "body" an S-expression to be evaluated. The
- semantics of the evaluation are defined with the EVAL function
- (see "The Interpreter" section).
- function - A LAMBDA expression or a function-pointer to a function. A
- function is always evaluated as an EVAL, SPREAD form.
- 2.4 Function Descriptions.
- Each function is provided with a prototypical header line. Each
- formal parameter is given a name and suffixed with its allowed type.
- Lower case tokens are names of classes and upper case tokens are
- parameter names referred to in the definition. The type of the value
- returned by the function (if any) is suffixed to the parameter list.
- If it is not commonly used the parameter type may be a specific set
- enclosed in brackets {...}. For example:
- PUTD(FNAME:id, TYPE:ftype, BODY:{lambda, function-pointer}):id
- PUTD is a function with three parameters. The parameter FNAME is an
- id to be the name of the function being defined. TYPE is the type of
- the function being defined and BODY is a lambda expression or a
- function-pointer. PUTD returns the name of the function being
- defined.
- Functions which accept formal parameter lists of arbitrary
- length have the type class and parameter enclosed in square brackets
- indicating that zero or more occurrences of that argument are
- permitted. For example:
- AND([U:any]):extra-boolean
- AND is a function which accepts zero or more arguments which may be
- of any type.
- 2.5 Function Types.
- EVAL type functions are those which are invoked with evaluated
- arguments. NOEVAL functions are invoked with unevaluated arguments.
- SPREAD type functions have their arguments passed in one-to-one
- correspondence with their formal parameters. NOSPREAD functions
- receive their arguments as a single list. EVAL, SPREAD functions are
- associated with EXPRs and NOEVAL, NOSPREAD functions with FEXPRs.
- EVAL, NOSPREAD and NOEVAL, SPREAD functions can be simulated using
- NOEVAL, NOSPREAD functions or MACROs.
- Standard LISP Report. 8
- 2. Preliminaries.
- EVAL, SPREAD type functions may have a maximum of 15 parameters.
- There is no limit on the number of parameters a NOEVAL, NOSPREAD
- function or MACRO may have.
- In the context of the description of an EVAL, SPREAD function,
- when we speak of the formal parameters we mean their actual values.
- However, in a NOEVAL, NOSPREAD function it is the unevaluated actual
- parameters.
- A third function type, the MACRO, implements functions which
- create S-expressions based on actual parameters. When a macro
- invocation is encountered, the body of the macro, a lambda
- expression, is invoked as a NOEVAL, NOSPREAD function with the
- macro's invocation bound as a list to the macros single formal
- parameter. When the macro has been evaluated the resulting
- S-expression is reevaluated. The description of the EVAL and EXPAND
- functions provide precise details.
- 2.6 The Extended Syntax.
- Functions that may be conveniently defined in Standard LISP
- appear in a subset of the REDUCE syntax [3] which we believe is
- easier to read than Standard LISP. A formal translation scheme for
- the extended syntax to Standard LISP is presented in Appendix A. The
- definitions supplied are not intended as a rigorous implementation
- guide but rather as a precise definition of the function's semantics.
- 2.7 Error and Warning Messages.
- Many functions detect errors. The description of such functions
- will include these error conditions and suggested formats for display
- of the generated error messages. A call on the ERROR function is
- implied but the error number is not specified by Standard LISP. In
- some cases a warning message is sufficient. To distinguish between
- errors and warnings, errors are prefixed with five asterisks and
- warnings with only three.
- Primitive functions check arguments that must be of a certain
- primitive type for being of that type and display an error message if
- the argument is not correct. The type mismatch error always takes the
- form:
- ***** PARAMETER not TYPE for FN
- Here PARAMETER is the unacceptable actual parameter, TYPE is the type
- that PARAMETER was supposed to be. FN is the name of the function
- that detected the error.
- Standard LISP Report. 9
- 3.1 Elementary Predicates.
- 3.1 Elementary Predicates.
- Functions in this section return T when the condition defined is
- met and NIL when it is not. Defined are type checking functions and
- elementary comparisons.
- ATOM(U:any):boolean
- Type: EVAL, SPREAD
- Returns T if U is not a pair.
- EXPR PROCEDURE ATOM(U);
- NULL PAIRP U;
- CODEP(U:any):boolean
- TYPE: EVAL, SPREAD.
- Returns T if U is a function-pointer.
- CONSTANTP(U:any):boolean
- Type: EVAL, SPREAD
- Returns T if U is a constant (a number, string, function-pointer, or
- vector).
- EXPR PROCEDURE CONSTANTP(U);
- NULL OR(PAIRP U, IDP U);
- EQ(U:any, V:any):boolean
- Type: EVAL, SPREAD
- Returns T if U points to the same object as V. EQ is not a reliable
- comparison between numeric arguments.
- EQN(U:any, V:any):boolean
- Type: EVAL, SPREAD
- Returns T if U and V are EQ or if U and V are numbers and have the
- same value and type.
- EQUAL(U:any, V:any):boolean
- Type: EVAL, SPREAD
- Returns T if U and V are the same. Dotted-pairs are compared
- recursively to the bottom levels of their trees. Vectors must have
- identical dimensions and EQUAL values in all positions. Strings must
- have identical characters. Function pointers must have EQ values.
- Other atoms must be EQN equal.
- Standard LISP Report. 10
- 3.1 Elementary Predicates.
- FIXP(U:any):boolean
- Type: EVAL, SPREAD
- Returns T if U is an integer (a fixed number).
- FLOATP(U:any):boolean
- Type: EVAL, SPREAD
- Returns T if U is a floating point number.
- IDP(U:any):boolean
- Type: EVAL, SPREAD
- Returns T if U is an id.
- NULL(U:any):boolean
- Type: EVAL, SPREAD
- Returns T if U is NIL.
- EXPR PROCEDURE NULL(U);
- U EQ NIL;
- NUMBERP(U:any):boolean
- Type: EVAL, SPREAD
- Returns T if U is a number (integer or floating).
- EXPR PROCEDURE NUMBERP(U);
- IF OR(FIXP U, FLOATP U) THEN T ELSE NIL;
- PAIRP(U:any):boolean
- Type: EVAL, SPREAD
- Returns T if U is a dotted-pair.
- STRINGP(U:any):boolean
- Type: EVAL, SPREAD
- Returns T if U is a string.
- VECTORP(U:any):boolean
- Type: EVAL, SPREAD
- Returns T if U is a vector.
- Standard LISP Report. 11
- 3.2 Functions on Dotted-Pairs.
- 3.2 Functions on Dotted-Pairs.
- The following are elementary functions on dotted-pairs. All
- functions in this section which require dotted-pairs as parameters
- detect a type mismatch error if the actual parameter is not a
- dotted-pair.
- CAR(U:dotted-pair):any
- Type: EVAL, SPREAD
- CAR(CONS a b) ==> a. The left part of U is returned. The type
- mismatch error occurs if U is not a dotted-pair.
- CDR(U:dotted-pair):any
- Type: EVAL, SPREAD
- CDR(CONS a b) ==> b. The right part of U is returned. The type
- mismatch error occurs if U is not a dotted-pair.
- The composites of CAR and CDR are supported up to 4 levels, namely:
- CAAAAR CAAAR CAAR
- CAAADR CAADR CADR
- CAADAR CADAR CDAR
- CAADDR CADDR CDDR
- CADAAR CDAAR
- CADADR CDADR
- CADDAR CDDAR
- CADDDR CDDDR
- CDAAAR
- CDAADR
- CDADAR
- CDADDR
- CDDAAR
- CDDADR
- CDDDAR
- CDDDDR
- CONS(U:any, V:any):dotted-pair
- Type: EVAL, SPREAD
- Returns a dotted-pair which is not EQ to anything and has U as its
- CAR part and V as its CDR part.
- LIST([U:any]):list
- Type: NOEVAL, NOSPREAD, or MACRO
- A list of the evaluation of each element of U is returned.
- FEXPR PROCEDURE LIST(U);
- EVLIS U;
- Standard LISP Report. 12
- 3.2 Functions on Dotted-Pairs.
- RPLACA(U:dotted-pair, V:any):dotted-pair
- Type: EVAL, SPREAD
- The CAR portion of the dotted-pair U is replaced by V. If dotted-pair
- U is (a . b) then (V . b) is returned. The type mismatch error occurs
- if U is not a dotted-pair.
- RPLACD(U:dotted-pair, V:any):dotted-pair
- Type: EVAL, SPREAD
- The CDR portion of the dotted-pair U is replaced by V. If dotted-pair
- U is (a . b) then (a . V) is returned. The type mismatch error occurs
- if U is not a dotted-pair.
- 3.3 Identifiers.
- The following functions deal with identifiers and the OBLIST,
- the structure of which is not defined. The function of the OBLIST is
- to provide a symbol table for identifiers created during input.
- Identifiers created by READ which have the same characters will
- therefore refer to the same object (see the EQ function in the
- "Elementary Predicates" section).
- COMPRESS(U:id-list):{atom}-{vector}
- Type: EVAL, SPREAD
- U is a list of single character identifiers which is built into a
- Standard LISP 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. Identifiers are not interned on the OBLIST. Function
- pointers may be compressed but this is an undefined use. If an entity
- cannot be parsed out of U or characters are left over after parsing
- an error occurs:
- ***** Poorly formed atom in COMPRESS
- EXPLODE(U:{atom}-{vector}):id-list
- Type: EVAL, SPREAD
- Returned is a list of interned characters representing the characters
- to print of the value of U. The primitive data types have these
- formats:
- integer - Leading zeroes are suppressed and a minus sign prefixes
- the digits if the integer is negative.
- floating - The value appears in the format [-]0.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.
- Standard LISP Report. 13
- 3.3 Identifiers.
- id - The characters of the print name of the identifier are
- produced with special characters prefixed with the escape
- character.
- string - The characters of the string are produced surrounded by
- double quotes "...".
- function-pointer - The value of the function-pointer is created as
- a list of characters conforming to the conventions of the system
- site.
- The type mismatch error occurs if U is not a number, identifier,
- string, or function-pointer.
- GENSYM():id
- Creates an identifier which is not interned on the OBLIST and
- consequently not EQ to anything else.
- INTERN(U:{id,string}):id
- Type: EVAL, SPREAD
- INTERN searches the OBLIST for an identifier with the same print name
- as U and returns the identifier on the OBLIST if a match is found.
- Any properties and global values associated with U may be lost. If U
- does not match any entry, a new one is created and returned. If U has
- more than the maximum number of characters permitted by the
- implementation (the minimum number is 24) an error occurs:
- ***** Too many characters to INTERN
- REMOB(U:id):id
- Type: EVAL, SPREAD
- If U is present on the OBLIST it is removed. This does not affect U
- having properties, flags, functions and the like. U is returned.
- 3.4 Property List Functions.
- With each id in the system is a "property list", a set of
- entities which are associated with the id for fast access. These
- entities are called "flags" if their use gives the id a single valued
- property, and "properties" if the id is to have a multivalued
- attribute: an indicator with a property.
- Flags and indicators may clash, consequently care should be
- taken to avoid this occurrence. Flagging X with an id which already
- is an indicator for X may result in that indicator and associated
- Standard LISP Report. 14
- 3.4 Property List Functions.
- property being lost. Likewise, adding an indicator which is the same
- id as a flag may result in the flag being destroyed.
- FLAG(U:id-list, V:id):NIL
- Type: EVAL, SPREAD
- U is a list of ids which are flagged with V. The effect of FLAG is
- that FLAGP will have the value T for those ids of U which were
- flagged. Both V and all the elements of U must be identifiers or the
- type mismatch error occurs.
- FLAGP(U:any, V:any):boolean
- Type: EVAL, SPREAD
- Returns T if U has been previously flagged with V, else NIL. Returns
- NIL if either U or V is not an id.
- GET(U:any, IND:any):any
- Type: EVAL, SPREAD
- Returns the property associated with indicator IND from the property
- list of U. If U does not have indicator IND, NIL is returned. GET
- cannot be used to access functions (use GETD instead).
- PUT(U:id, IND:id, PROP:any):any
- Type: EVAL, SPREAD
- The indicator IND with the property PROP is placed on the property
- list of the id U. If the action of PUT occurs, the value of PROP is
- returned. If either of U and IND are not ids the type mismatch error
- will occur and no property will be placed. PUT cannot be used to
- define functions (use PUTD instead).
- REMFLAG(U:any-list, V:id):NIL
- Type: EVAL, SPREAD
- Removes the flag V from the property list of each member of the list
- U. Both V and all the elements of U must be ids or the type mismatch
- error will occur.
- REMPROP(U:any, IND:any):any
- Type: EVAL, SPREAD
- Removes the property with indicator IND from the property list of U.
- Returns the removed property or NIL if there was no such indicator.
- Standard LISP Report. 15
- 3.5 Function Definition.
- 3.5 Function Definition.
- Functions in Standard LISP are global entities. To avoid
- function-variable naming clashes no variable may have the same name
- as a function.
- DE(FNAME:id, PARAMS:id-list, FN:any):id
- Type: NOEVAL, NOSPREAD
- The function FN with the formal parameter list PARAMS is added to the
- set of defined functions with the name FNAME. Any previous
- definitions of the function are lost. The function created is of type
- EXPR unless the !*COMP variable is T in which case the EXPR is
- compiled. The name of the defined function is returned.
- FEXPR PROCEDURE DE(U);
- PUTD(CAR U, 'EXPR, LIST('LAMBDA, CADR U, CADDR U));
- DF(FNAME:id, PARAM:id-list, FN:any):id
- Type: NOEVAL, NOSPREAD
- The function FN with formal parameter PARAM is added to the set of
- defined functions with the name FNAME. Any previous definitions of
- the function are lost. The function created is of type FEXPR unless
- the !*COMP variable is T in which case the FEXPR is compiled. The
- name of the defined function is returned.
- FEXPR PROCEDURE DF(U);
- PUTD(CAR U, 'FEXPR, LIST('LAMBDA, CADR U, CADDR U));
- DM(MNAME:id, PARAM:id-list, FN:any):id
- Type: NOEVAL, NOSPREAD
- The macro FN with the formal parameter PARAM is added to the set of
- defined functions with the name MNAME. Any previous definitions of
- the function are overwritten. The function created is of type MACRO.
- The name of the macro is returned.
- FEXPR PROCEDURE DM(U);
- PUTD(CAR U, 'MACRO, LIST('LAMBDA, CADR U, CADDR U));
- GETD(FNAME:any):{NIL, dotted-pair}
- Type: EVAL, SPREAD
- If FNAME is not the name of a defined function, NIL is returned. If
- FNAME is a defined function then the dotted-pair
- (TYPE:ftype . DEF:{function-pointer, lambda}) is returned.
- Standard LISP Report. 16
- 3.5 Function Definition.
- PUTD(FNAME:id, TYPE:ftype, BODY:function):id
- Type: EVAL, SPREAD
- Creates a function with name FNAME and definition BODY of type TYPE.
- If PUTD succeeds the name of the defined function is returned. The
- effect of PUTD is that GETD will return a dotted-pair with the
- functions type and definition. Likewise the GLOBALP predicate will
- return T when queried with the function name.
- If the function FNAME has already been declared as a GLOBAL or
- FLUID variable the error:
- ***** FNAME is a non-local variable
- occurs and the function will not be defined. If function FNAME
- already exists a warning message will appear:
- *** FNAME redefined
- The function defined by PUTD will be compiled before definition
- if the !*COMP global variable is non-NIL (see the "System GLOBAL
- Variables" section).
- REMD(FNAME:id):{NIL, dotted-pair}
- Type: EVAL, SPREAD
- Removes the function named FNAME from the set of defined functions.
- Returns the (ftype . function) dotted-pair or NIL as does GETD. The
- global/function attribute of FNAME is removed and the name may be
- used subsequently as a variable.
- 3.6 Variables and Bindings.
- A variable is a place holder for a Standard LISP entity which is
- said to be bound to the variable. The scope of a variable is the
- range over which the variable has a defined value. There are three
- different binding mechanisms in Standard LISP.
- Local Binding - This type of binding occurs only in compiled
- functions. Local variables occur as formal parameters in lambda
- expressions and as PROG form variables. The binding occurs when a
- lambda expression is evaluated or when a PROG form is executed.
- The scope of a local variable is the body of the function in which
- it is defined.
- Global Binding - Only one binding of a global variable exists at any
- time allowing direct access to the value bound to the variable.
- The scope of a global variable is universal. Variables declared
- GLOBAL may not appear as parameters in lambda expressions or as
- PROG form variables. A variable must be declared GLOBAL prior to
- its use as a global variable since the default type for undeclared
- variables is FLUID.
- Standard LISP Report. 17
- 3.6 Variables and Bindings.
- Fluid Binding - Fluid variables are global in scope but may occur as
- formal parameters or PROG form variables. In interpreted functions
- all formal parameters and PROG form variables are considered to
- have fluid binding until changed to local binding by compilation.
- When fluid variables are used as parameters they are rebound in
- such a way that the previous binding may be restored. All
- references to fluid variables are to the currently active binding.
- FLUID(IDLIST:id-list):NIL
- Type: EVAL, SPREAD
- The ids in IDLIST are declared as FLUID type variables (ids not
- previously declared are initialized to NIL). Variables in IDLIST
- already declared FLUID are ignored. Changing a variable's type from
- GLOBAL to FLUID is not permissible and results in the error:
- ***** ID cannot be changed to FLUID
- FLUIDP(U:any):boolean
- Type: EVAL, SPREAD
- If U has been declared FLUID (by declaration only) T is returned,
- otherwise NIL is returned.
- GLOBAL(IDLIST:id-list):NIL
- Type: EVAL, SPREAD
- The ids of IDLIST are declared global type variables. If an id has
- not been declared previously it is initialized to NIL. Variables
- already declared GLOBAL are ignored. Changing a variables type from
- FLUID to GLOBAL is not permissible and results in the error:
- ***** ID cannot be changed to GLOBAL
- GLOBALP(U:any):boolean
- Type: EVAL, SPREAD
- If U has been declared GLOBAL or is the name of a defined function, T
- is returned, else NIL is returned.
- Standard LISP Report. 18
- 3.6 Variables and Bindings.
- SET(EXP:id, VALUE:any):any
- Type: EVAL, SPREAD
- EXP must be an identifier or a type mismatch error occurs. The effect
- of SET is replacement of the item bound to the identifier by VALUE.
- If the identifier is not a local variable or has not been declared
- GLOBAL it is automatically declared FLUID with the resulting warning
- message:
- *** EXP declared FLUID
- EXP must not evaluate to T or NIL or an error occurs:
- ***** Cannot change T or NIL
- SETQ(VARIABLE:id, VALUE:any):any
- Type: NOEVAL, NOSPREAD
- If VARIABLE is not local or GLOBAL it is by default declared FLUID
- and the warning message:
- *** VARIABLE declared FLUID
- appears. The value of the current binding of VARIABLE is replaced by
- the value of VALUE. VARIABLE must not be T or NIL or an error occurs:
- ***** Cannot change T or NIL
- MACRO PROCEDURE SETQ(X);
- LIST('SET, LIST('QUOTE, CADR X), CADDR X);
- UNFLUID(IDLIST:id-list):NIL
- Type: EVAL, SPREAD
- The variables in IDLIST that have been declared as FLUID variables
- are no longer considered as fluid variables. Others are ignored. This
- affects only compiled functions as free variables in interpreted
- functions are automatically considered fluid (see Ref. [1]).
- 3.7 Program Feature Functions.
- These functions provide for explicit control sequencing, and the
- definition of blocks altering the scope of local variables.
- Standard LISP Report. 19
- 3.7 Program Feature Functions.
- GO(LABEL:id)
- Type: NOEVAL, NOSPREAD
- GO alters the normal flow of control within a PROG function. The next
- statement of a PROG function to be evaluated is immediately preceded
- by LABEL. A GO may only appear in the following situations:
- 1) At the top level of a PROG referencing a label which also
- appears at the top level of the same PROG.
- 2a) As the consequent of a COND item of a COND appearing on the top
- level of a PROG.
- 2b) As the consequent of a COND item which appears as the
- consequent of a COND item to any level.
- 3a) As the last statement of a PROGN which appears at the top level
- of a PROG or in a PROGN appearing in the consequent of a COND to
- any level subject to the restrictions of 2a,b.
- 3b) As the last statement of a PROGN within a PROGN or as the
- consequent of a COND in a PROGN to any level subject to the
- restrictions of 2a,b and 3a.
- If LABEL does not appear at the top level of the PROG in which
- the GO appears, an error occurs:
- ***** LABEL is not a known label
- If the GO has been placed in a position not defined by rules
- 1-3, another error is detected:
- ***** Illegal use of GO to LABEL
- PROG(VARS:id-list, [PROGRAM:{id, any}]):any
- Type: NOEVAL, NOSPREAD
- VARS is a list of ids which are considered fluid when the PROG is
- interpreted and local when compiled (see the "Variables and Bindings"
- section). The PROGs variables are allocated space when the PROG form
- is invoked and are deallocated when the PROG is exited. PROG
- variables are initialized to NIL. The PROGRAM is a set of expressions
- to be evaluated in order of their appearance in the PROG function.
- Identifiers appearing in the top level of the PROGRAM are labels
- which can be referenced by GO. The value returned by the PROG
- function is determined by a RETURN function or NIL if the PROG "falls
- through".
- PROGN([U:any]):any
- Type: NOEVAL, NOSPREAD
- U is a set of expressions which are executed sequentially. The value
- returned is the value of the last expression.
- Standard LISP Report. 20
- 3.7 Program Feature Functions.
- RETURN(U:any)
- Type: EVAL, SPREAD
- Within a PROG, RETURN terminates the evaluation of a PROG and returns
- U as the value of the PROG. The restrictions on the placement of
- RETURN are exactly those of GO. Improper placement of RETURN results
- in the error:
- ***** Illegal use of RETURN
- 3.8 Error Handling.
- ERROR(NUMBER:integer, MESSAGE:any)
- Type: EVAL, SPREAD
- NUMBER and MESSAGE are passed back to a surrounding ERRORSET (the
- Standard LISP reader has an ERRORSET). MESSAGE is placed in the
- global variable EMSG!* and the error number becomes the value of the
- surrounding ERRORSET. FLUID variables and local bindings are unbound
- to return to the environment of the ERRORSET. Global variables are
- not affected by the process.
- ERRORSET(U:any, MSGP:boolean, TR:boolean):any
- Type: EVAL, SPREAD
- If an error occurs during the evaluation of U, the value of NUMBER
- from the ERROR call is returned as the value of ERRORSET. In
- addition, if the value of MSGP is non-NIL, the MESSAGE from the ERROR
- call is displayed upon both the standard output device and the
- currently selected output device unless the standard output device is
- not open. The message appears prefixed with 5 asterisks. The MESSAGE
- list is displayed without top level parentheses. The MESSAGE from the
- ERROR call will be available in the global variable EMSG!*. The exact
- format of error messages generated by Standard LISP functions
- described in this document are not fixed and should not be relied
- upon to be in any particular form. Likewise, error numbers generated
- by Standard LISP functions are implementation dependent.
- If no error occurs during the evaluation of U, the value of
- (LIST (EVAL U)) is returned.
- If an error has been signaled and the value of TR is non-NIL a
- traceback sequence will be initiated on the selected output device.
- The traceback will display information such as unbindings of FLUID
- variables, argument lists and so on in an implementation dependent
- format.
- Standard LISP Report. 21
- 3.9 Vectors.
- 3.9 Vectors.
- Vectors are structured entities in which random elements may be
- accessed with an integer index. A vector has a single dimension. Its
- maximum size is determined by the implementation and available space.
- A suggested input output "vector notation" is defined (see "Classes
- of Primitive Data Types").
- GETV(V:vector, INDEX:integer):any
- Type: EVAL, SPREAD
- Returns the value stored at position INDEX of the vector V. The type
- mismatch error may occur. An error occurs if the INDEX does not lie
- within 0...UPBV(V) inclusive:
- ***** INDEX subscript is out of range
- MKVECT(UPLIM:integer):vector
- Type: EVAL, SPREAD
- Defines and allocates space for a vector with UPLIM+1 elements
- accessed as 0...UPLIM. Each element is initialized to NIL. An error
- will occur if UPLIM is < 0 or there is not enough space for a vector
- of this size:
- ***** A vector of size UPLIM cannot be allocated
- PUTV(V:vector, INDEX:integer, VALUE:any):any
- Type: EVAL, SPREAD
- Stores VALUE into the vector V at position INDEX. VALUE is returned.
- The type mismatch error may occur. If INDEX does not lie in
- 0...UPBV(V) an error occurs:
- ***** INDEX subscript is out of range
- UPBV(U:any):{NIL,integer}
- Type: EVAL, SPREAD
- Returns the upper limit of U if U is a vector, or NIL if it is not.
- Standard LISP Report. 22
- 3.10 Boolean Functions and Conditionals.
- 3.10 Boolean Functions and Conditionals.
- AND([U:any]):extra-boolean
- Type: NOEVAL, NOSPREAD
- AND evaluates each U until a value of NIL is found or the end of the
- list is encountered. If a non-NIL value is the last value it is
- returned, or NIL is returned.
- FEXPR PROCEDURE AND(U);
- BEGIN
- IF NULL U THEN RETURN NIL;
- LOOP: IF NULL CDR U THEN RETURN EVAL CAR U
- ELSE IF NULL EVAL CAR U THEN RETURN NIL;
- U := CDR U;
- GO LOOP
- END;
- COND([U:cond-form]):any
- Type: NOEVAL, NOSPREAD
- The antecedents of all U's are evaluated in order of their appearance
- until a non-NIL value is encountered. The consequent of the selected
- U is evaluated and becomes the value of the COND. The consequent may
- also contain the special functions GO and RETURN subject to the
- restraints given for these functions in the "Program Feature
- Functions" section. In these cases COND does not have a defined
- value, but rather an effect. If no antecedent is non-NIL the value of
- COND is NIL. An error is detected if a U is improperly formed:
- ***** Improper cond-form as argument of COND
- NOT(U:any):boolean
- Type: EVAL, SPREAD
- If U is NIL, return T else return NIL (same as NULL function).
- EXPR PROCEDURE NOT(U);
- U EQ NIL;
- Standard LISP Report. 23
- 3.10 Boolean Functions and Conditionals.
- OR([U:any]):extra-boolean
- Type: NOEVAL, NOSPREAD
- U is any number of expressions which are evaluated in order of their
- appearance. When one is found to be non-NIL it is returned as the
- value of OR. If all are NIL, NIL is returned.
- FEXPR PROCEDURE OR(U);
- BEGIN SCALAR X;
- LOOP: IF NULL U THEN RETURN NIL
- ELSE IF (X := EVAL CAR U) THEN RETURN X;
- U := CDR U;
- GO LOOP
- END;
- 3.11 Arithmetic Functions.
- Conversions between numeric types are provided explicitly by the
- FIX and FLOAT functions and implicitly by any multi-parameter
- arithmetic function which receives mixed types of arguments. A
- conversion from fixed to floating point numbers may result in a loss
- of precision without a warning message being generated. Since
- integers may have a greater magnitude that that permitted for
- floating numbers, an error may be signaled when the attempted
- conversion cannot be done. Because the magnitude of integers is
- unlimited the conversion of a floating point number to a fixed number
- is always possible, the only loss of precision being the digits to
- the right of the decimal point which are truncated. If a function
- receives mixed types of arguments the general rule will have the
- fixed numbers converted to floating before arithmetic operations are
- performed. In all cases an error occurs if the parameter to an
- arithmetic function is not a number:
- ***** XXX parameter to FUNCTION is not a number
- XXX is the value of the parameter at fault and FUNCTION is the name
- of the function that detected the error. Exceptions to the rule are
- noted where they occur.
- ABS(U:number):number
- Type: EVAL, SPREAD
- Returns the absolute value of its argument.
- EXPR PROCEDURE ABS(U);
- IF LESSP(U, 0) THEN MINUS(U) ELSE U;
- Standard LISP Report. 24
- 3.11 Arithmetic Functions.
- DIFFERENCE(U:number, V:number):number
- Type: EVAL, SPREAD
- The value U - V is returned.
- DIVIDE(U:number, V:number):dotted-pair
- Type: EVAL, SPREAD
- The dotted-pair (quotient . remainder) is returned. The quotient part
- is computed the same as by QUOTIENT and the remainder the same as by
- REMAINDER. An error occurs if division by zero is attempted:
- ***** Attempt to divide by 0 in DIVIDE
- EXPR PROCEDURE DIVIDE(U, V);
- (QUOTIENT(U, V) . REMAINDER(U, V));
- EXPT(U:number, V:integer):number
- Type: EVAL, SPREAD
- Returns U raised to the V power. A floating point U to an integer
- power V does not have V changed to a floating number before
- exponentiation.
- FIX(U:number):integer
- Type: EVAL, SPREAD
- Returns an integer which corresponds to the truncated value of U. The
- result of conversion must retain all significant portions of U. If U
- is an integer it is returned unchanged.
- FLOAT(U:number):floating
- Type: EVAL, SPREAD
- The floating point number corresponding to the value of the argument
- U is returned. Some of the least significant digits of an integer may
- be lost do to the implementaion of floating point numbers. FLOAT of a
- floating point number returns the number unchanged. If U is too large
- to represent in floating point an error occurs:
- ***** Argument to FLOAT is too large
- GREATERP(U:number, V:number):boolean
- Type: EVAL, SPREAD
- Returns T if U is strictly greater than V, otherwise returns NIL.
- LESSP(U:number, V:number):boolean
- Type: EVAL, SPREAD
- Returns T if U is strictly less than V, otherwise returns NIL.
- Standard LISP Report. 25
- 3.11 Arithmetic Functions.
- MAX([U:number]):number
- Type: NOEVAL, NOSPREAD, or MACRO
- Returns the largest of the values in U. If two or more values are the
- same the first is returned.
- MACRO PROCEDURE MAX(U);
- EXPAND(CDR U, 'MAX2);
- MAX2(U:number, V:number):number
- Type: EVAL, SPREAD
- Returns the larger of U and V. If U and V are the same value U is
- returned (U and V might be of different types).
- EXPR PROCEDURE MAX2(U, V);
- IF LESSP(U, V) THEN V ELSE U;
- MIN([U:number]):number
- Type: NOEVAL, NOSPREAD, or MACRO
- Returns the smallest of the values in U. If two ore more values are
- the same the first of these is returned.
- MACRO PROCEDURE MIN(U);
- EXPAND(CDR U, 'MIN2);
- MIN2(U:number, V:number):number
- Type: EVAL, SPREAD
- Returns the smaller of its arguments. If U and V are the same value,
- U is returned (U and V might be of different types).
- EXPR PROCEDURE MIN2(U, V);
- IF GREATERP(U, V) THEN V ELSE U;
- MINUS(U:number):number
- Type: EVAL, SPREAD
- Returns -U.
- EXPR PROCEDURE MINUS(U);
- DIFFERENCE(0, U);
- PLUS([U:number]):number
- Type: NOEVAL, NOSPREAD, or MACRO
- Forms the sum of all its arguments.
- MACRO PROCEDURE PLUS(U);
- EXPAND(CDR U, 'PLUS2);
- Standard LISP Report. 26
- 3.11 Arithmetic Functions.
- PLUS2(U:number, V:number):number
- Type: EVAL, SPREAD
- Returns the sum of U and V.
- QUOTIENT(U:number, V:number):number
- Type: EVAL, SPREAD
- The quotient of U divided by V is returned. Division of two positive
- or two negative integers is conventional. When both U and V are
- integers and exactly one of them is negative the value returned is
- the negative truncation of the absolute value of U divided by the
- absolute value of V. An error occurs if division by zero is
- attempted:
- ***** Attempt to divide by 0 in QUOTIENT
- REMAINDER(U:number, V:number):number
- Type: EVAL, SPREAD
- If both U and V are integers the result is the integer remainder of U
- divided by V. If either parameter is floating point, the result is
- the difference between U and V*(U/V) all in floating point. If either
- number is negative the remainder is negative. If both are positive or
- both are negative the remainder is positive. An error occurs if V is
- zero:
- ***** Attempt to divide by 0 in REMAINDER
- EXPR PROCEDURE REMAINDER(U, V);
- DIFFERENCE(U, TIMES2(QUOTIENT(U, V), V));
- TIMES([U:number]):number
- Type: NOEVAL, NOSPREAD, or MACRO
- Returns the product of all its arguments.
- MACRO PROCEDURE TIMES(U);
- EXPAND(CDR U, 'TIMES2);
- TIMES2(U:number, V:number):number
- Type: EVAL, SPREAD
- Returns the product of U and V.
- Standard LISP Report. 27
- 3.12 MAP Composite Functions.
- 3.12 MAP Composite Functions.
- MAP(X:list, FN:function):any
- Type: EVAL, SPREAD
- Applies FN to successive CDR segments of X. NIL is returned.
- EXPR PROCEDURE MAP(X, FN);
- WHILE X DO << FN X;
- X := CDR X >>;
- MAPC(X:list, FN:function):any
- Type: EVAL, SPREAD
- FN is applied to successive CAR segments of list X. NIL is returned.
- EXPR PROCEDURE MAPC(X, FN);
- WHILE X DO << FN CAR X;
- X := CDR X >>;
- MAPCAN(X:list, FN:function):any
- Type: EVAL, SPREAD
- A concatenated list of FN applied to successive CAR elements of X is
- returned.
- EXPR PROCEDURE MAPCAN(X, FN);
- IF NULL X THEN NIL
- ELSE NCONC(FN CAR X, MAPCAN(CDR X, FN));
- MAPCAR(X:list, FN:function):any
- Type: EVAL, SPREAD
- Returned is a constructed list of FN applied to each CAR of list X.
- EXPR PROCEDURE MAPCAR(X, FN);
- IF NULL X THEN NIL
- ELSE FN CAR X . MAPCAR(CDR X, FN);
- MAPCON(X:list, FN:function):any
- Type: EVAL, SPREAD
- Returned is a concatenated list of FN applied to successive CDR
- segments of X.
- EXPR PROCEDURE MAPCON(X, FN);
- IF NULL X THEN NIL
- ELSE NCONC(FN X, MAPCON(CDR X, FN));
- Standard LISP Report. 28
- 3.12 MAP Composite Functions.
- MAPLIST(X:list, FN:function):any
- Type: EVAL, SPREAD
- Returns a constructed list of FN applied to successive CDR segments
- of X.
- EXPR PROCEDURE MAPLIST(X, FN);
- IF NULL X THEN NIL
- ELSE FN X . MAPLIST(CDR X, FN);
- 3.13 Composite Functions.
- APPEND(U:list, V:list):list
- Type: EVAL, SPREAD
- Returns a constructed list in which the last element of U is followed
- by the first element of V. The list U is copied, V is not.
- EXPR PROCEDURE APPEND(U, V);
- IF NULL U THEN V
- ELSE CAR U . APPEND(CDR U, V);
- ASSOC(U:any, V:alist):{dotted-pair, NIL}
- Type: EVAL, SPREAD
- If U occurs as the CAR portion of an element of the alist V, the
- dotted-pair in which U occurred is returned, else NIL is returned.
- ASSOC might not detect a poorly formed alist so an invalid
- construction may be detected by CAR or CDR.
- EXPR PROCEDURE ASSOC(U, V);
- IF NULL V THEN NIL
- ELSE IF ATOM CAR V THEN
- ERROR(000, LIST(V, "is a poorly formed alist"))
- ELSE IF U = CAAR V THEN CAR V
- ELSE ASSOC(U, CDR V);
- Standard LISP Report. 29
- 3.13 Composite Functions.
- DEFLIST(U:dlist, IND:id):list
- Type: EVAL, SPREAD
- A "dlist" is a list in which each element is a two element list:
- (ID:id PROP:any). Each ID in U has the indicator IND with property
- PROP placed on its property list by the PUT function. The value of
- DEFLIST is a list of the first elements of each two element list.
- Like PUT, DEFLIST may not be used to define functions.
- EXPR PROCEDURE DEFLIST(U, IND);
- IF NULL U THEN NIL
- ELSE <<PUT(CAAR U, IND, CADAR U);
- CAAR U >> . DEFLIST(CDR U, IND);
- DELETE(U:any, V:list):list
- Type: EVAL, SPREAD
- Returns V with the first top level occurrence of U removed from it.
- EXPR PROCEDURE DELETE(U, V);
- IF NULL V THEN NIL
- ELSE IF CAR V = U THEN CDR V
- ELSE CAR V . DELETE(U, CDR V);
- DIGIT(U:any):boolean
- Type: EVAL, SPREAD
- Returns T if U is a digit, otherwise NIL.
- EXPR PROCEDURE DIGIT(U);
- IF MEMQ(U, '(!0 !1 !2 !3 !4 !5 !6 !7 !8 !9))
- THEN T ELSE NIL;
- LENGTH(X:any):integer
- Type: EVAL, SPREAD
- The top level length of the list X is returned.
- EXPR PROCEDURE LENGTH(X);
- IF ATOM X THEN 0
- ELSE PLUS(1, LENGTH CDR X);
- LITER(U:any):boolean
- Type: EVAL, SPREAD
- Returns T if U is a character of the alphabet, NIL otherwise.
- EXPR PROCEDURE 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))
- THEN T ELSE NIL;
- Standard LISP Report. 30
- 3.13 Composite Functions.
- MEMBER(A:any, B:list):extra-boolean
- Type: EVAL, SPREAD
- Returns NIL if A is not a member of list B, returns the remainder of
- B whose first element is A.
- EXPR PROCEDURE MEMBER(A, B);
- IF NULL B THEN NIL
- ELSE IF A = CAR B THEN B
- ELSE MEMBER(A, CDR B);
- MEMQ(A:any, B:list):extra-boolean
- Type: EVAL, SPREAD
- Same as MEMBER but an EQ check is used for comparison.
- EXPR PROCEDURE MEMQ(A, B);
- IF NULL B THEN NIL
- ELSE IF A EQ CAR B THEN B
- ELSE MEMQ(A, CDR B);
- NCONC(U:list, V:list):list
- Type: EVAL, SPREAD
- Concatenates V to U without copying U. The last CDR of U is modified
- to point to V.
- EXPR PROCEDURE NCONC(U, V);
- BEGIN SCALAR W;
- IF NULL U THEN RETURN V;
- W := U;
- WHILE CDR W DO W := CDR W;
- RPLACD(W, V);
- RETURN U
- END;
- PAIR(U:list, V:list):alist
- Type: EVAL, SPREAD
- U and V are lists which must have an identical number of elements. If
- not, an error occurs (the 000 used in the ERROR call is arbitrary and
- need not be adhered to). Returned is a list where each element is a
- dotted-pair, the CAR of the pair being from U, and the CDR the
- corresponding element from V.
- EXPR PROCEDURE PAIR(U, V);
- IF AND(U, V) THEN (CAR U . CAR V) . PAIR(CDR U, CDR V)
- ELSE IF OR(U, V) THEN ERROR(000,
- "Different length lists in PAIR")
- ELSE NIL;
- Standard LISP Report. 31
- 3.13 Composite Functions.
- REVERSE(U:list):list
- Type: EVAL, SPREAD
- Returns a copy of the top level of U in reverse order.
- EXPR PROCEDURE REVERSE(U);
- BEGIN SCALAR W;
- WHILE U DO << W := CAR U . W;
- U := CDR U >>;
- RETURN W
- END;
- SASSOC(U:any, V:alist, FN:function):any
- Type: EVAL, SPREAD
- Searches the alist V for an occurrence of U. If U is not in the alist
- the evaluation of function FN is returned.
- EXPR PROCEDURE SASSOC(U, V, FN);
- IF NULL V THEN FN()
- ELSE IF U = CAAR V THEN CAR V
- ELSE SASSOC(U, CDR V, FN);
- SUBLIS(X:alist, Y:any):any
- Type: EVAL, SPREAD
- The value returned is the result of substituting the CDR of each
- element of the alist X for every occurrence of the CAR part of that
- element in Y.
- EXPR PROCEDURE SUBLIS(X, Y);
- IF NULL X THEN Y
- ELSE BEGIN SCALAR U;
- U := ASSOC(Y, X);
- RETURN IF U THEN CDR U
- ELSE IF ATOM Y THEN Y
- ELSE SUBLIS(X, CAR Y) . SUBLIS(X, CDR Y)
- END;
- SUBST(U:any, V:any, W:any):any
- Type: EVAL, SPREAD
- The value returned is the result of substituting U for all
- occurrences of V in W.
- EXPR PROCEDURE SUBST(U, V, W);
- IF NULL W THEN NIL
- ELSE IF V = W THEN U
- ELSE IF ATOM W THEN W
- ELSE SUBST(U, V, CAR W) . SUBST(U, V, CDR W);
- Standard LISP Report. 32
- 3.14 The Interpreter.
- 3.14 The Interpreter.
- APPLY(FN:{id,function}, ARGS:any-list):any
- Type: EVAL, SPREAD
- APPLY returns the value of FN with actual parameters ARGS. The actual
- parameters in ARGS are already in the form required for binding to
- the formal parameters of FN.
- EXPR PROCEDURE APPLY(FN, ARGS);
- BEGIN SCALAR DEFN;
- IF CODEP FN THEN RETURN
- {Spread the actual parameters in ARGS following the conventions
- for calling functions, transfer to the entry point of the
- function, and return the value returned by the function.};
- IF IDP FN THEN RETURN
- IF NULL(DEFN := GETD FN) THEN
- ERROR(000, LIST(FN, "is an undefined function"))
- ELSE IF CAR DEFN EQ 'EXPR THEN
- APPLY(CDR DEFN, ARGS)
- ELSE ERROR(000, LIST(FN, "cannot be evaluated by APPLY"));
- IF OR(ATOM FN, NOT(CAR FN EQ 'LAMBDA)) THEN
- ERROR(000, LIST(FN, "cannot be evaluated by APPLY"));
- RETURN
- {Bind the actual parameters in ARGS to the formal parameters of
- the lambda expression. If the two lists are not of equal length
- then ERROR(000, "Number of parameters do not match"); The value
- returned is EVAL CADDR FN.}
- END;
- EVAL(U:any):any
- Type: EVAL, SPREAD
- The value of the expression U is computed. Error numbers are
- arbitrary. Portions of EVAL involving machine specific coding are
- expressed in English enclosed in brackets {...}.
- EXPR PROCEDURE EVAL(U);
- BEGIN SCALAR FN;
- IF CONSTANTP U THEN RETURN U;
- IF IDP U THEN RETURN
- {U is an id. Return the value most currently bound to U or if
- there is no such binding: ERROR(000, LIST("Unbound:", U))};
- IF PAIRP CAR U THEN RETURN
- IF CAAR U EQ 'LAMBDA THEN APPLY(CAR U, EVLIS CDR U)
- ELSE ERROR(000, LIST(CAR U,
- "improperly formed LAMBDA expression"))
- ELSE IF CODEP CAR U THEN RETURN APPLY(CAR U, EVLIS CDR U);
- FN := GETD CAR U;
- IF NULL FN THEN
- ERROR(000, LIST(CAR U, "is an undefined function"))
- ELSE IF CAR FN EQ 'EXPR THEN
- Standard LISP Report. 33
- 3.14 The Interpreter.
- RETURN APPLY(CDR FN, EVLIS CDR U)
- ELSE IF CAR FN EQ 'FEXPR THEN
- RETURN APPLY(CDR FN, LIST CDR U)
- ELSE IF CAR FN EQ 'MACRO THEN
- RETURN EVAL APPLY(CDR FN, LIST U)
- END;
- EVLIS(U:any-list):any-list
- Type: EVAL, SPREAD
- EVLIS returns a list of the evaluation of each element of U.
- EXPR PROCEDURE EVLIS(U);
- IF NULL U THEN NIL
- ELSE EVAL CAR U . EVLIS CDR U;
- EXPAND(L:list, FN:function):list
- Type: EVAL, SPREAD
- FN is a defined function of two arguments to be used in the expansion
- of a MACRO. EXPAND returns a list in the form:
- (FN L[0] (FN L[1] ... (FN L[n-1] L[n]) ... ))
- "n" is the number of elements in L, L[i] is the ith element of L.
- EXPR PROCEDURE EXPAND(L,FN);
- IF NULL CDR L THEN CAR L
- ELSE LIST(FN, CAR L, EXPAND(CDR L, FN));
- FUNCTION(FN:function):function
- Type: NOEVAL, NOSPREAD
- The function FN is to be passed to another function. If FN is to have
- side effects its free variables must be fluid or global. FUNCTION is
- like QUOTE but its argument may be affected by compilation. We do not
- consider FUNARGs in this report.
- QUOTE(U:any):any
- Type: NOEVAL, NOSPREAD
- Stops evaluation and returns U unevaluated.
- FEXPR PROCEDURE QUOTE(U);
- CAR U;
- Standard LISP Report. 34
- 3.15 Input and Output.
- 3.15 Input and Output.
- The user normally communicates with Standard LISP through
- "standard devices" . The default devices are selected in accordance
- with the conventions of the implementation site. Other input and
- output devices or files may be selected for reading and writing using
- the functions described herein.
- CLOSE(FILEHANDLE:any):any
- Type: EVAL, SPREAD
- Closes the file with the internal name FILEHANDLE writing any
- necessary end of file marks and such. The value of FILEHANDLE is that
- returned by the corresponding OPEN. The value returned is the value
- of FILEHANDLE. An error occurs if the file can not be closed.
- ***** FILEHANDLE could not be closed
- EJECT():NIL
- Causes a skip to the top of the next output page. Automatic EJECTs
- are executed by the print functions when the length set by the
- PAGELENGTH function is exceeded.
- LINELENGTH(LEN:{integer, NIL}):integer
- Type: EVAL, SPREAD
- If LEN is an integer the maximum line length to be printed before the
- print functions initiate an automatic TERPRI is set to the value LEN.
- No initial Standard LISP line length is assumed. The previous line
- length is returned except when LEN is NIL. This special case returns
- the current line length and does not cause it to be reset. An error
- occurs if the requested line length is too large for the currently
- selected output file or LEN is negative or zero.
- ***** LEN is an invalid line length
- LPOSN():integer
- Returns the number of lines printed on the current page. At the top
- of a page, 0 is returned.
- Standard LISP Report. 35
- 3.15 Input and Output.
- OPEN(FILE:any, HOW:id):any
- Type: EVAL, SPREAD
- Open the file with the system dependent name FILE for output if HOW
- is EQ to OUTPUT, or input if HOW is EQ to INPUT. If the file is
- opened successfully, a value which is internally associated with the
- file is returned. This value must be saved for use by RDS and WRS. An
- error occurs if HOW is something other than INPUT or OUTPUT or the
- file can't be opened.
- ***** HOW is not option for OPEN
- ***** FILE could not be opened
- PAGELENGTH(LEN:{integer, NIL}):integer
- Type: EVAL, SPREAD
- Sets the vertical length (in lines) of an output page. Automatic page
- EJECTs are executed by the print functions when this length is
- reached. The initial vertical length is implementation specific. The
- previous page length is returned. If LEN is 0, no automatic page
- ejects will occur.
- POSN():integer
- Returns the number of characters in the output buffer. When the
- buffer is empty, 0 is returned.
- PRINC(U:id):id
- Type: EVAL, SPREAD
- U must be a single character id such as produced by EXPLODE or read
- by READCH or the value of !$EOL!$. The effect is the character U
- displayed upon the currently selected output device. The value of
- !$EOL!$ causes termination of the current line like a call to TERPRI.
- PRINT(U:any):any
- Type: EVAL, SPREAD
- Displays U in READ readable format and terminates the print line. The
- value of U is returned.
- EXPR PROCEDURE PRINT(U);
- BEGIN
- PRIN1 U;
- TERPRI();
- RETURN U
- END;
- Standard LISP Report. 36
- 3.15 Input and Output.
- PRIN1(U:any):any
- Type: EVAL, SPREAD
- U is displayed in a READ readable form. The format of display is the
- result of EXPLODE expansion; special characters are prefixed with the
- escape character !, and strings are enclosed in "...". Lists are
- displayed in list-notation and vectors in vector-notation .
- PRIN2(U:any):any
- Type: EVAL, SPREAD
- U is displayed upon the currently selected print device but output is
- not READ readable. The value of U is returned. Items are displayed as
- described in the EXPLODE function with the exceptions that the escape
- character does not prefix special characters and strings are not
- enclosed in "...". Lists are displayed in list-notation and vectors
- in vector-notation. The value of U is returned.
- RDS(FILEHANDLE:any):any
- Type: EVAL, SPREAD
- Input from the currently selected input file is suspended and further
- input comes from the file named. FILEHANDLE is a system dependent
- internal name which is a value returned by OPEN. If FILEHANDLE is NIL
- the standard input device is selected. When end of file is reached on
- a non-standard input device, the standard input device is reselected.
- When end of file occurs on the standard input device the Standard
- LISP reader terminates. RDS returns the internal name of the
- previously selected input file.
- ***** FILEHANDLE could not be selected for input
- READ():any
- Returns the next expression from the file currently selected for
- input. Valid input forms are: vector-notation, dot-notation,
- list-notation, numbers, function-pointers, strings, and identifiers
- with escape characters. Identifiers are interned on the OBLIST (see
- the INTERN function in the "Identifiers" section). READ returns the
- value of !$EOF!$ when the end of the currently selected input file is
- reached.
- READCH():id
- Returns the next interned character from the file currently selected
- for input. Two special cases occur. If all the characters in an input
- record have been read, the value of !$EOL!$ is returned. If the file
- selected for input has all been read the value of !$EOF!$ is
- returned.
- TERPRI():NIL
- The current print line is terminated.
- Standard LISP Report. 37
- 3.15 Input and Output.
- WRS(FILEHANDLE:any):any
- Type: EVAL, SPREAD
- Output to the currently active output file is suspended and further
- output is directed to the file named. FILEHANDLE is an internal name
- which is returned by OPEN. The file named must have been opened for
- output. If FILEHANDLE is NIL the standard output device is selected.
- WRS returns the internal name of the previously selected output file.
- ***** FILEHANDLE could not be selected for output
- 3.16 LISP Reader.
- An EVAL read loop has been chosen to drive a Standard LISP
- system to provide a continuity in functional syntax. Choices of
- messages and the amount of extra information displayed are decisions
- left to the implementor.
- EXPR PROCEDURE STANDARD!-LISP();
- BEGIN SCALAR VALUE;
- RDS NIL; WRS NIL;
- PRIN2 "Standard LISP"; TERPRI();
- WHILE T DO
- << PRIN2 "EVAL:"; TERPRI();
- VALUE := ERRORSET(QUOTE EVAL READ(), T, T);
- IF NOT ATOM VALUE THEN PRINT CAR VALUE;
- TERPRI() >>;
- END;
- Standard LISP Report. 38
- 4. System GLOBAL Variables.
- 4. System GLOBAL Variables.
- These variables provide global control of the LISP system, or
- implement values which are constant throughout execution.
- !*COMP - Initial value = NIL.
- The value of !*COMP controls whether or not PUTD compiles the
- function defined in its arguments before defining it. If !*COMP is
- NIL the function is defined as an xEXPR. If !*COMP is something else
- the function is first compiled. Compilation will produce certain
- changes in the semantics of functions particularly FLUID type access.
- EMSG!* - Initial value = NIL.
- Will contain the MESSAGE generated by the last ERROR call (see the
- "Error Handling" section).
- !$EOF!$ - Value = an uninterned identifier
- The value of !$EOF!$ is returned by all input functions when the end
- of the currently selected input file is reached.
- !$EOL!$ - Value = an uninterned identifier
- The value of !$EOL!$ is returned by READCH when it reaches the end of
- a logical input record. Likewise PRINC will terminate its current
- line (like a call to TERPRI) when !$EOL!$ is its argument.
- NIL - Value = NIL
- NIL is a special global variable. It is protected from being modified
- by SET or SETQ.
- !*RAISE - Initial value = NIL
- If !*RAISE is T all characters input through Standard LISP
- input/output functions will be raised to upper case. If !*RAISE is
- NIL characters will be input as is.
- T - Value = T
- T is a special global variable. It is protected from being modified
- by SET or SETQ.
- Standard LISP Report. 39
- Acknowledgment. The authors would like to thank the following persons
- whose helpful comments contributed to the completion of this
- document. J. Fitch, I. Frick, E. Goto, S. Harrington, R. Jenks, A.
- Lux, A. Norman, M. Rothstein, M. Wirth.
- Standard LISP Report. 40
- List of References.
- List of References
- [1] M. L. Griss, A. C. Hearn, A Portable LISP Compiler, (in
- preparation).
- [2] A. C. Hearn, Standard LISP, SIGPLAN Notices, ACM, Vol. 4, No. 9,
- September 1966, Reprinted in SIGSAM Bulletin, ACM, Vol. 13, 1969, p.
- 28-49.
- [3] A. C. Hearn, REDUCE 2 Symbolic Mode Primer, Utah Computational
- Physics, Operating Note No. 5.1, October 1974.
- -, REDUCE 2 User's Manual, Utah Computational Physics, UCP-19, March
- 1973.
- [4] LISP Reference Manual, CDC-6000, Computation Center, The
- University of Texas at Austin.
- [5] LISP/360 Reference Manual, Stanford Center for Information
- Processing, Stanford University.
- [6] John McCarthy, Paul W. Abrahams, Daniel J. Edwards, Timothy P.
- Hart, Michael I. Levin, LISP 1.5 Programmers Manual, The Computation
- Center and Research Laboratory of Electronics, Massachusettes
- Institute of Technology, The M.I.T. Press, Cambridge, Massachusettes,
- 1965.
- [7] MACLISP Reference Manual, March 6, 1976.
- [8] J. Strother Moore II, The INTERLISP Virtual Machine
- Specification, CSL 76-5 September 1976, XEROX, Palo Alto Research
- Center.
- [9] Mats Nordstrom, Erik Sandewall, Diz Breslow, LISP F1: A FORTRAN
- Implementation of LISP 1.5, Uppsala University, Department of
- Computer Sciences.
- [10] Lynn H. Quam, Whitfield Diffie, Stanford LISP 1.6 Manual,
- Stanford Artificial Intelligence Laboratory, Operating Note 28.7.
- [11] Warren Teitelman, INTERLISP Reference Manual, XEROX, Palo Alto
- Research Center, 1974.
- [12] Clark Weissman, LISP 1.5 Primer, Dickenson Publishing Company,
- Inc., 1967.
- Standard LISP Report. 41
- Appendix A. The Extended Syntax.
- The Extended Syntax.
- Whenever it is possible to define Standard LISP functions in
- LISP the text of the function will appear in an extended syntax.
- These definitions are supplied as an aid to understanding the
- behavior of functions and not as a strict implementation guide. A
- formal scheme for the translation of extended syntax to Standard LISP
- is presented to eliminate misinterpretation of the definitions.
- The goal of the transformation scheme is to produce a PUTD
- invocation which has the function translated from the extended syntax
- as its actual parameter. A rule has a name in brackets <...> by
- which it is known and is defined by what follows the meta symbol ::=.
- Each rule of the set consists of one or more "alternatives" separated
- by the | meta symbol, being the different ways in which the rule will
- be matched by source text. Each alternative is composed of a
- "recognizer" and a "generator" separated by the ==> meta symbol. The
- recognizer is a concatenation of any of three different forms. 1)
- Terminals - Upper case lexemes and punctuation which is not part of
- the meta syntax represent items which must appear as is in the source
- text for the rule to succeed. 2) Rules - Lower case lexemes enclosed
- in <...> are names of other rules. The source text is matched if the
- named rule succeeds. 3) Primitives - Lower case singletons not in
- brackets are names of primitives or primitive classes of Standard
- LISP. The syntax and semantics of the primitives are given in Part
- I.
- The recognizer portion of the following rule matches an extended
- syntax procedure:
- <function> ::= ftype PROCEDURE id (<id list>); <statement>; ==>
- A function is recognized as an "ftype" (one of the tokens EXPR,
- FEXPR, etc.) followed by the keyword PROCEDURE, followed by an "id"
- (the name of the function), followed by an "<id list>" (the formal
- parameter names) enclosed in parentheses. A semicolon terminates the
- title line. The body of the function is a <statement> followed by a
- semicolon. For example:
- EXPR PROCEDURE NULL(X); EQ(X, NIL);
- satisfies the recognizer, causes the generator to be activated and
- the rule to be matched successfully.
- The generator is a template into which generated items are
- substituted. The three syntactic entities have corresponding
- meanings when they appear in the generator portion. 1) Terminals -
- These lexemes are copied as is to the generated text. 2) Rules - If
- Standard LISP Report. 42
- Appendix A. The Extended Syntax.
- a rule has succeeded in the recognizer section then the value of the
- rule is the result of the generator portion of that rule. 3)
- Primitives - When primitives are matched the primitive lexeme
- replaces its occurrence in the generator.
- If more than one occurrence of an item would cause ambiguity in
- the generator portion this entity appears with a bracketed subscript.
- Thus:
- <conditional> ::=
- IF <expression> THEN <statement[1]> ELSE <statement[2]>...
- has occurrences of two different <statement>s. The generator portion
- uses the subscripted entities to reference the proper generated
- value.
- The <function> rule appears in its entirety as:
- <function> ::= ftype PROCEDURE id (<id list>); <statement>;
- ==> (PUTD (QUOTE id) (QUOTE ftype)
- (QUOTE (LAMBDA (<id list>) <statement>)))
- If the recognizer succeeds (as it would in the case of the NULL
- procedure example) the generator returns:
- (PUTD (QUOTE NULL) (QUOTE EXPR) (QUOTE (LAMBDA (X) (EQ X NIL))))
- The identifier in the template is replaced by the procedure name
- NULL, <id list> by the single formal parameter X, the <statement> by
- (EQ X NIL) which is the result of the <statement> generator. EXPR
- replaces ftype, the type of the defined procedure.
- The Extended Syntax Rules
- <function> ::= ftype PROCEDURE id (<id list>); <statement>;
- ==> (PUTD (QUOTE id) (QUOTE ftype)
- (QUOTE (LAMBDA (<id list>) <statement>)))
- <id list> ::= id ==> id
- | id, <id list> ==> id <id list>
- <statement> ::= <expression> ==> <expression>
- | <proper statement> ==> <proper statement>
- <proper statement> ::=
- Standard LISP Report. 43
- Appendix A. The Extended Syntax.
- <assignment statement> ==> <assignment statement>
- | <conditional statement> ==> <conditional statement>
- | <while statement> ==> <while statement>
- | <compound statement> ==> <compound statement>
- <assignment statement> ::= id := <expression>
- ==> (SETQ id <expression>)
- <conditional statement> ::=
- IF <expression> THEN <statement[1]> ELSE <statement[2]>
- ==> (COND (<expression> <statement[1]>)
- (T <statement[2]>))
- | IF <expression> THEN <statement>
- ==> (COND (<expression> <statement>))
- <while statement> ::= WHILE <expression> DO <statement>
- ==> (PROG NIL
- LBL (COND ((NULL <expression>) (RETURN NIL)))
- <statement>
- (GO LBL))
- <compound statement> ::=
- BEGIN SCALAR <id list>; <program list> END
- ==> (PROG (<id list>) <program list>)
- | BEGIN <program list> END
- ==> (PROG NIL <program list>)
- | << <statement list> >> ==> (PROGN <statement list>)
- <program list> ::= <full statement> ==> <full statement>
- | <full statement> <program list>
- ==> <full statement> <program list>
- <full statement> ::= <statement> ==> <statement>
- | id: ==> id
- <statement list> ::= <statement> ==> <statement>
- | <statement>; <statement list>
- ==> <statement> <statement list>
- <expression> ::= <expression[1]> . <expression[2]>
- ==> (CONS <expression[1]> <expression[2]>
- | <expression[1]> = <expression[2]>
- ==> (EQUAL <expression[1]> <expression[2]>)
- | <expression[1]> EQ <expression[2]>
- ==> (EQ <expression[1]> <expression[2]>)
- | '<expression> ==> (QUOTE <expression>)
- | function <expression> ==> (function <expression>)
- | function(<argument list>)
- ==> (function <argument list>)
- | number ==> number
- | id ==> id
- <argument list> ::= () ==>
- | <expression> ==> <expression>
- Standard LISP Report. 44
- Appendix A. The Extended Syntax.
- | <expression>, <argument list>
- ==> <expression> <argument list>
- Notice the three infix operators . EQ and = which are
- translated into calls on CONS, EQ, and EQUAL respectively. Note also
- that a call on a function which has no formal parameters must have ()
- as an argument list. The QUOTE function is abbreviated by '.
- Standard LISP Report. 45
- Appendix B. Alphabetical List of Functions
- The following is an alphabetical list of the Standard LISP functions
- with formal parameters and the page on which they are defined.
- ABS(U:number):number 23
- AND([U:any]):extra-boolean 22
- APPEND(U:list, V:list):list 28
- APPLY(FN:{id,function}, ARGS:any-list):any 32
- ASSOC(U:any, V:alist):{dotted-pair,NIL} 28
- ATOM(U:any):boolean 9
- CAR(U:dotted-pair):any 11
- CDR(U:dotted-pair):any 11
- CLOSE(FILEHANDLE:any):any 34
- CODEP(U:any):boolean 9
- COMPRESS(U:id-list):{atom}-{vector} 12
- COND([U:cond-form]):any 22
- CONS(U:any, V:any):dotted-pair 11
- CONSTANTP(U:any):boolean 9
- DE(FNAME:id, PARAMS:id-list, FN:any):id 15
- DEFLIST(U:dlist, IND:id):list 29
- DELETE(U:any, V:list):list 29
- DF(FNAME:id, PARAM:id-list, FN:any):id 15
- DIFFERENCE(U:number, V:number):number 24
- DIGIT(U:any):boolean 29
- DIVIDE(U:number, V:number):dotted-pair 24
- DM(MNAME:id, PARAM:id-list, FN:any):id 15
- EJECT():NIL 34
- EQ(U:any, V:any):boolean 9
- EQN(U:any, V:any):boolean 9
- EQUAL(U:any, V:any):boolean 9
- ERROR(NUMBER:integer, MESSAGE:any) 20
- ERRORSET(U:any, MSGP:boolean, TR:boolean):any 20
- EVAL(U:any):any 32
- EVLIS(U:any-list):any-list 33
- EXPAND(L:list, FN:function):list 33
- EXPLODE(U:{atom}-{vector}):id-list 12
- EXPT(U:number, V:integer):number 24
- FIX(U:number):integer 24
- FIXP(U:any):boolean 10
- FLAG(U:id-list, V:id):NIL 14
- FLAGP(U:any, V:any):boolean 14
- FLOAT(U:number):floating 24
- FLOATP(U:any):boolean 10
- FLUID(IDLIST:id-list):NIL 17
- FLUIDP(U:any):boolean 17
- FUNCTION(FN:function):function 33
- Standard LISP Report. 46
- Appendix B. Alphabetical List of Functions
- GENSYM():id 13
- GET(U:any, IND:any):any 14
- GETD(FNAME:any):{NIL, dotted-pair} 15
- GETV(V:vector, INDEX:integer):any 21
- GLOBAL(IDLIST:id-list):NIL 17
- GLOBALP(U:any):boolean 17
- GO(LABEL:id) 19
- GREATERP(U:number, V:number):boolean 24
- IDP(U:any):boolean 10
- INTERN(U:{id,string}):id 13
- LENGTH(X:any):integer 29
- LESSP(U:number, V:number):boolean 24
- LINELENGTH(LEN:{integer,NIL}):integer 34
- LIST([U:any]):list 11
- LITER(U:any):boolean 29
- LPOSN():integer 34
- MAP(X:list, FN:function):any 27
- MAPC(X:list, FN:function):any 27
- MAPCAN(X:list, FN:function):any 27
- MAPCAR(X:list, FN:function):any 27
- MAPCON(X:list, FN:function):any 27
- MAPLIST(X:list, FN:function):any 28
- MAX([U:number]):number 25
- MAX2(U:number, V:number):number 25
- MEMBER(A:any, B:list):extra-boolean 30
- MEMQ(A:any, B:list):extra-boolean 30
- MIN([U:number]):number 25
- MINUS(U:number):number 25
- MIN2(U:number, V:number):number 25
- MKVECT(UPLIM:integer):vector 21
- NCONC(U:list, V:list):list 30
- NOT(U:any):boolean 22
- NULL(U:any):boolean 10
- NUMBERP(U:any):boolean 10
- OPEN(FILE:any, HOW:id):any 35
- OR([U:any]):extra-boolean 23
- PAGELENGTH(LEN:{integer,NIL}):integer 35
- PAIR(U:list, V:list):alist 30
- PAIRP(U:any):boolean 10
- PLUS([U:number]):number 25
- PLUS2(U:number, V:number):number 26
- POSN():integer 35
- PRINC(U:id):id 35
- PRINT(U:any):any 35
- PRIN1(U:any):any 36
- PRIN2(U:any):any 36
- PROG(VARS:id-list, [PROGRAM:{id,any}]):any 19
- PROGN([U:any]):any 19
- Standard LISP Report. 47
- Appendix B. Alphabetical List of Functions
- PUT(U:id, IND:id, PROP:any):any 14
- PUTD(FNAME:id, TYPE:ftype, BODY:function):id 16
- PUTV(V:vector, INDEX:integer, VALUE:any):any 21
- QUOTE(U:any):any 33
- QUOTIENT(U:number, V:number):number 26
- RDS(FILEHANDLE:any):any 36
- READ():any 36
- READCH():id 36
- REMAINDER(U:number, V:number):number 26
- REMD(FNAME:id):{NIL, dotted-pair} 16
- REMFLAG(U:any-list, V:id):NIL 14
- REMOB(U:id):id 13
- REMPROP(U:any, IND:any):any 14
- RETURN(U:any) 20
- REVERSE(U:list):list 31
- RPLACA(U:dotted-pair, V:any):dotted-pair 12
- RPLACD(U:dotted-pair, V:any):dotted-pair 12
- SASSOC(U:any, V:alist, FN:function):any 31
- SET(EXP:id, VALUE:any):any 18
- SETQ(VARIABLE:id, VALUE:any):any 18
- STRINGP(U:any):boolean 10
- SUBLIS(X:alist, Y:any):any 31
- SUBST(U:any, V:any, W:any):any 31
- TERPRI():NIL 36
- TIMES([U:number]):number 26
- TIMES2(U:number, V:number):number 26
- UNFLUID(IDLIST:id-list):NIL 18
- UPBV(U:any):{NIL,integer} 21
- VECTORP(U:any):boolean 10
- WRS(FILEHANDLE:any):any 37
- Standard LISP Report. 48
- Index.
- Index.
- !$EOF!$, 36, 38
- !$EOL!$, 36, 38
- !*COMP, 15, 38
- !*RAISE, 38
- ABS, 23
- alist, 6
- AND, 22
- antecedent, 6
- any, 6
- APPEND, 28
- APPLY, 32
- Arithmetic Functions, 23
- ASSOC, 28
- association list, 6
- ATOM, 9
- atom, 6
- binding, 3
- boolean, 5
- Boolean Functions, 22
- C...R composites, 11
- CAR, 11
- CDR, 11
- CLOSE, 34
- CODEP, 5, 9
- Composite functions, 28
- COMPRESS, 12
- COND, 22
- cond-form, 6
- Conditional, 22
- CONS, 11
- consequent, 6
- constant, 6
- CONSTANTP, 9
- DE, 15
- DEFLIST, 29
- DELETE, 29
- DF, 15
- DIFFERENCE, 24
- DIGIT, 29
- DIVIDE, 24
- DM, 15
- dot-notation, 4, 36
- dotted-pair, 4
- Standard LISP Report. 49
- Index.
- EJECT, 34
- Elementary Predicates, 9
- EMSG!*, 20, 38
- EQ, 9
- EQN, 9
- EQUAL, 9
- ERROR, 20
- ERROR handling, 8, 20
- Error messages, 8
- ERRORSET, 20
- escape character, 4, 13
- EVAL, 32
- EVAL functions, 7
- EVAL, SPREAD functions, 7
- EVAL, SPREAD parameter limit, 7
- EVLIS, 33
- EXPAND, 33
- EXPLODE, 12
- EXPR, 5
- EXPT, 24
- extra-boolean, 5
- FEXPR, 5
- FIX, 24
- FIXP, 10
- FLAG, 14
- FLAGP, 14
- flags, 3, 13
- FLOAT, 24
- floating, 3, 12
- FLOATP, 10
- FLUID, 17
- fluid binding, 17
- FLUIDP, 17
- ftype, 5
- funargs, 33
- FUNCTION, 33
- function, 3, 7
- Function Definition, 15
- function-pointer, 5, 13
- Functions on Dotted-Pairs, 11
- GENSYM, 13
- GET, 14
- GETD, 15
- GETV, 21
- GLOBAL, 17
- global binding, 16
- GLOBALP, 17
- GO, 19
- GREATERP, 24
- id, 3, 13
- identifiers, 3, 12
- Standard LISP Report. 50
- Index.
- IDP, 10
- indicator, 13
- Input and output, 34
- integer, 3, 12
- INTERN, 13
- Interpreter, 32
- lambda, 6
- LAMBDA expression, 6
- LENGTH, 29
- LESSP, 24
- LINELENGTH, 34
- LISP reader, 37
- LIST, 11
- list, 6
- list-notation, 6, 36
- LITER, 29
- local binding, 16
- LPOSN, 34
- MACRO, 5
- MAP, 27
- MAPC, 27
- MAPCAN, 27
- MAPCAR, 27
- MAPCON, 27
- MAPLIST, 28
- MAX, 25
- MAX2, 25
- MEMBER, 30
- MEMQ, 30
- MIN, 25
- MINUS, 25
- MIN2, 25
- MKVECT, 21
- NCONC, 30
- NIL, 5, 38
- NOEVAL functions, 7
- NOSPREAD functions, 7
- NOT, 22
- NULL, 10
- number, 5
- NUMBERP, 10
- object, 9, 12
- OBLIST, 3, 12, 13
- OPEN, 35
- OR, 23
- PAGELENGTH, 35
- PAIR, 30
- PAIRP, 10
- PLUS, 25
- Standard LISP Report. 51
- Index.
- PLUS2, 26
- POSN, 35
- PRINC, 35
- PRINT, 35
- print name, 3, 13
- PRIN1, 36
- PRIN2, 36
- PROG, 19
- PROGN, 19
- Program Feature Functions, 18
- properties, 3, 13
- Property List Functions, 13
- PUT, 14
- PUTD, 16
- PUTV, 21
- QUOTE, 33
- QUOTIENT, 26
- RDS, 36
- READ, 36
- READCH, 36
- REMAINDER, 26
- REMD, 16
- REMFLAG, 14
- REMOB, 13
- REMPROP, 14
- RETURN, 20
- REVERSE, 31
- RPLACA, 12
- RPLACD, 12
- S-expression, 6
- SASSOC, 31
- SET, 18
- SETQ, 18
- SPREAD functions, 7
- standard devices, 34
- string, 13
- STRINGP, 10
- strings, 4
- structures, 6
- SUBLIS, 31
- SUBST, 31
- System GLOBAL Variables, 38
- T, 5, 38
- TERPRI, 36
- TIMES, 26
- TIMES2, 26
- type mismatch error, 8
- UNFLUID, 18
- UPBV, 21
- Standard LISP Report. 52
- Index.
- variable, 16
- variables, 3
- Variables and Bindings, 16
- vector, 4
- vector-notation, 4, 36
- VECTORP, 10
- Vectors, 21
- Warning messages, 8
- WRS, 37
- Standard LISP Report.
- TABLE OF CONTENTS
- 1. Introduction .................................... 1
- 2. Preliminaries ................................... 3
- 2.1 Primitive Data Types ............................ 3
- 2.2 Classes of Primitive Data Types ................. 5
- 2.3 Structures ...................................... 6
- 2.4 Function Descriptions ........................... 7
- 2.5 Function Types .................................. 7
- 2.6 The Extended Syntax ............................. 8
- 2.7 Error and Warning Messages ...................... 8
- 3. Functions ....................................... 9
- 3.1 Elementary Predicates ........................... 9
- 3.2 Functions on Dotted-Pairs ....................... 11
- 3.3 Identifiers ..................................... 12
- 3.4 Property List Functions ......................... 13
- 3.5 Function Definition ............................. 15
- 3.6 Variables and Bindings ......................... 16
- 3.7 Program Feature Functions ....................... 18
- 3.8 Error Handling .................................. 20
- 3.9 Vectors ......................................... 21
- 3.10 Boolean Functions and Conditionals .............. 22
- 3.11 Arithmetic Functions ............................ 23
- 3.12 MAP Composite Functions ......................... 27
- 3.13 Composite Functions ............................. 28
- 3.14 The Interpreter ................................. 32
- 3.15 Input and Output ................................ 34
- 3.16 LISP Reader ..................................... 37
- 4. System GLOBAL Variables ......................... 38
- List of References ................................... 40
- Appendix A. The Extended Syntax ...................... 41
- Appendix B. Alphabetical List of Functions ........... 45
- Index ................................................ 48
|