|
|
1.1 ! root 1: .\" Copyright (c) 1980 Regents of the University of California. ! 2: .\" All rights reserved. The Berkeley software License Agreement ! 3: .\" specifies the terms and conditions for redistribution. ! 4: .\" ! 5: .\" @(#)ch1.n 6.3 (Berkeley) 5/14/86 ! 6: .\" ! 7: .\" $Header: ch1.n,v 1.3 83/07/27 15:11:17 layer Exp $ ! 8: .Lc \s+2F\s-2RANZ\s0\ L\s-2ISP\s0\s-2 1 ! 9: .sh 2 ! 10: .Fr \*[\(dg\*] ! 11: was created as a tool to further research in symbolic and ! 12: algebraic manipulation, ! 13: artificial intelligence, ! 14: and programming languages at the University of California ! 15: at Berkeley. ! 16: .(f ! 17: \*[\(dg\*]It is rumored that this name has something to do with Franz ! 18: Liszt [F\fIr\fPa\*:nts List] (1811-1886) a Hungarian composer ! 19: and keyboard virtuoso. ! 20: These allegations have never been proven. ! 21: .)f ! 22: Its roots are in a PDP-11 Lisp system which originally came ! 23: from Harvard. ! 24: As it grew it adopted features of Maclisp and Lisp Machine Lisp. ! 25: Substantial compatibility with other Lisp dialects ! 26: (Interlisp, UCILisp, CMULisp) is achieved by ! 27: means of support packages and compiler switches. ! 28: The heart of ! 29: .Fr ! 30: is written almost entirely in the programming language C. ! 31: Of course, it has been greatly extended by additions written ! 32: in Lisp. ! 33: A small part is written in the assembly language for the current ! 34: host machines, VAXen and a couple of flavors of 68000. ! 35: Because ! 36: .Fr ! 37: is written in C, it is relatively portable and easy to comprehend. ! 38: .pp ! 39: .Fr ! 40: is capable of running large lisp programs in a timesharing environment, ! 41: has facilities for arrays and user defined structures, ! 42: has a user controlled reader with character and word macro capabilities, ! 43: and can interact directly with compiled Lisp, C, Fortran, and Pascal code. ! 44: .pp ! 45: This document is a reference manual for the ! 46: .Fr ! 47: system. ! 48: It is not a Lisp primer or introduction to the language. ! 49: Some parts will be of interest primarily to those maintaining ! 50: .Fr ! 51: at their computer site. ! 52: There is an additional document entitled ! 53: \fIThe Franz Lisp System,\fP ! 54: by John Foderaro, which partially describes the system implementation. ! 55: .Fr , ! 56: as delivered by Berkeley, includes all source code ! 57: and machine readable version of this manual and system document. ! 58: The system document is in a single file named "franz.n" in ! 59: the "doc" subdirectory. ! 60: .pp ! 61: This document is divided into four Movements. ! 62: In the first one we will attempt to describe the language of ! 63: .Fr ! 64: precisely and completely as it now stands (Opus 38.69, June 1983). ! 65: In the second Movement we will look at the reader, function types, ! 66: arrays and exception handling. ! 67: In the third Movement we will look at several large support packages ! 68: written to help the ! 69: .Fr ! 70: user, namely the trace package, compiler, fixit and stepping package. ! 71: Finally the fourth movement contains an index into the other movements. ! 72: In the rest of this chapter we shall examine the data types of ! 73: .Fr . ! 74: The conventions used in the description of the ! 75: .Fr ! 76: functions will be given in \(sc1.3 -- it is very important that ! 77: these conventions are understood. ! 78: .sh 2 Data\ Types ! 79: .Fr ! 80: has fourteen data types. ! 81: In this section we shall look in detail at each type and if a type is ! 82: divisible we shall look inside it. ! 83: There is a Lisp function ! 84: .i type ! 85: which will return the type name of a lisp object. ! 86: This is the official ! 87: .Fr ! 88: name for that type and we will use this name and this name only in ! 89: the manual to avoid confusing the reader. ! 90: The types are listed in terms of importance rather than alphabetically. ! 91: .sh 3 lispval - - 0 ! 92: This is the name we use to describe any Lisp object. ! 93: The function ! 94: .i type ! 95: will never return `lispval'. ! 96: .sh 3 symbol ! 97: This object corresponds to a variable in most other programming languages. ! 98: It may have a value or may be `unbound'. ! 99: A symbol may be ! 100: .i lambda ! 101: .i bound ! 102: meaning that its current value is stored ! 103: away somewhere and the symbol is given a new value for the duration of a ! 104: certain context. ! 105: When the Lisp processor leaves that context, the ! 106: symbol's current value is thrown ! 107: away and its old value is restored. ! 108: .sp .5v ! 109: A symbol may also have a ! 110: .i function ! 111: .i binding . ! 112: This function binding is static; it cannot be lambda bound. ! 113: Whenever the symbol is used in the functional position of a Lisp expression ! 114: the function binding of the symbol is examined (see Chapter 4 for more ! 115: details on evaluation). ! 116: .sp .5v ! 117: A symbol may also have a ! 118: .i property ! 119: .i list , ! 120: another static data structure. ! 121: The property list consists of a list of an even number of elements, ! 122: considered to be grouped as pairs. ! 123: The first element of the pair is the ! 124: .i indicator ! 125: the second the ! 126: .i value ! 127: of that indicator. ! 128: .sp .5v ! 129: Each symbol has a print name ! 130: .i (pname) ! 131: which is how this symbol is accessed from input and referred to ! 132: on (printed) output. ! 133: .sp .5v ! 134: A symbol also has a hashlink used to link symbols together in the ! 135: oblist -- this field is inaccessible to the lisp user. ! 136: .sp .5v ! 137: Symbols are created by the reader and by the functions ! 138: .i concat , ! 139: .i maknam ! 140: and their derivatives. ! 141: Most symbols live on ! 142: .Fr 's ! 143: sole ! 144: .i oblist , ! 145: and therefore two symbols with the same print name are ! 146: usually the exact same object (they are ! 147: .i eq ). ! 148: Symbols which are not on the oblist are said to be ! 149: .i uninterned. ! 150: The function ! 151: .i maknam ! 152: creates uninterned symbols while ! 153: .i concat ! 154: creates ! 155: .i interned ! 156: ones. ! 157: .(b ! 158: .TS ! 159: box center ; ! 160: c | c | c | c . ! 161: Subpart name Get value Set value Type ! 162: ! 163: = ! 164: value eval set lispval ! 165: setq ! 166: _ ! 167: property plist setplist list or nil ! 168: list get putprop ! 169: defprop ! 170: _ ! 171: function getd putd array, binary, list ! 172: binding def or nil ! 173: _ ! 174: print name get_pname string ! 175: _ ! 176: hash link ! 177: .TE ! 178: .)b ! 179: .sh 3 list ! 180: A list cell has two parts, called the car and cdr. ! 181: List cells are created by the function ! 182: .i cons . ! 183: .(b ! 184: .TS ! 185: box center ; ! 186: c | c | c | c . ! 187: Subpart name Get value Set value Type ! 188: ! 189: = ! 190: car car rplaca lispval ! 191: _ ! 192: cdr cdr rplacd lispval ! 193: .TE ! 194: .)b ! 195: .sh 3 binary ! 196: This type acts as a function header for machine coded functions. ! 197: It has two parts, a pointer to the start of the function and a ! 198: symbol whose print name describes the ! 199: argument ! 200: .i discipline . ! 201: The discipline (if ! 202: .i lambda , ! 203: .i macro ! 204: or ! 205: .i nlambda ) ! 206: determines whether the arguments to this function will be evaluated ! 207: by the caller ! 208: before this function is called. ! 209: If the discipline is a string (specifically ! 210: "\fIsubroutine\fP", ! 211: "\fIfunction\fP", ! 212: "\fIinteger-function\fP", ! 213: "\fIreal-function\fP", ! 214: "\fIc-function\fP", ! 215: "\fIdouble-c-function\fP", ! 216: or "\fIvector-c-function\fP" ! 217: ) ! 218: then this function is ! 219: a foreign subroutine or function (see \(sc8.5 for more details on this). ! 220: Although the type of the ! 221: .i entry ! 222: field of a binary type object is usually \fBstring\fP or \fBother\fP, ! 223: the object pointed to ! 224: is actually a sequence of machine instructions. ! 225: .br ! 226: Objects of type binary are created by ! 227: .i mfunction, ! 228: .i cfasl, ! 229: and ! 230: .i getaddress. ! 231: .(b ! 232: .TS ! 233: box center ; ! 234: c | c | c | c . ! 235: Subpart name Get value Set value Type ! 236: ! 237: = ! 238: entry getentry string or fixnum ! 239: _ ! 240: discipline getdisc putdisc symbol or fixnum ! 241: .TE ! 242: .)b ! 243: .sh 3 fixnum ! 244: A fixnum is an integer constant in the range \(mi2\*[31\*] to ! 245: 2\*[31\*]\(mi1. ! 246: Small fixnums (-1024 to 1023) are stored in a special table so they needn't be ! 247: allocated each time one is needed. ! 248: In principle, the range for fixnums is machine dependent, although ! 249: all current implementations for franz have this range. ! 250: .sh 3 flonum ! 251: A flonum is a double precision real number. On the VAX, ! 252: the range is ! 253: \(+-2.9\(mu10\*[-37\*] to \(+-1.7\(mu10\*[38\*]. ! 254: There are approximately sixteen decimal digits of precision. ! 255: Other machines may have other ranges. ! 256: .sh 3 bignum ! 257: A bignum is an integer of potentially unbounded size. ! 258: When integer arithmetic exceeds the limits of fixnums mentioned above, ! 259: the calculation is automatically done with bignums. ! 260: Should calculation with bignums give a result which can be represented ! 261: as a fixnum, then the fixnum representation will be used\*[\(dg\*]. ! 262: .(f ! 263: \*[\(dg\*]The current algorithms for integer arithmetic operations will return ! 264: (in certain cases) a result ! 265: between \(+-2\*[30\*] and 2\*[31\*] as a bignum although this ! 266: could be represented as a fixnum. ! 267: .)f ! 268: This contraction is known as ! 269: .i integer ! 270: .i normalization . ! 271: Many Lisp functions assume that integers are normalized. ! 272: Bignums are composed of a sequence of ! 273: .b list ! 274: cells and a cell known as an ! 275: .b sdot. ! 276: The user should consider a ! 277: .b bignum ! 278: structure indivisible and use functions such as ! 279: .i haipart , ! 280: and ! 281: .i bignum-leftshift ! 282: to extract parts of it. ! 283: .sh 3 string ! 284: A string is a null terminated sequence of characters. ! 285: Most functions of symbols which operate on the symbol's print name will ! 286: also work on strings. ! 287: The default reader syntax is set so that ! 288: a sequence of characters surrounded by double quotes is a string. ! 289: .sh 3 port ! 290: A port is a structure which the system I/O routines can reference to ! 291: transfer data between the Lisp system and external media. ! 292: Unlike other Lisp objects there are a very limited number of ports (20). ! 293: Ports are allocated by ! 294: .i infile ! 295: and ! 296: .i outfile ! 297: and deallocated by ! 298: .i close ! 299: and ! 300: .i resetio . ! 301: The ! 302: .i print ! 303: function prints a port as a percent sign followed by the name of the file it ! 304: is connected to (if the port was opened by \fIfileopen, infile, or outfile\fP). ! 305: During initialization, ! 306: .Fr ! 307: binds the symbol \fBpiport\fP to a port attached to the standard input stream. ! 308: This port prints as %$stdin. ! 309: There are ports connected to the standard output and error streams, ! 310: which print as %$stdout and %$stderr. ! 311: This is discussed in more detail at the beginning of Chapter 5. ! 312: .sh 3 vector ! 313: Vectors are indexed sequences of data. ! 314: They can be used to implement a notion of user-defined types ! 315: via their associated property list. ! 316: They make \fBhunks\fP (see below) logically unnecessary, although hunks are very ! 317: efficiently garbage collected. ! 318: There is a second kind of vector, called an immediate-vector, ! 319: which stores binary data. ! 320: The name that the function \fItype\fP returns for immediate-vectors ! 321: is \fBvectori\fP. ! 322: Immediate-vectors could be used to implement strings and block-flonum arrays, ! 323: for example. ! 324: Vectors are discussed in chapter 9. ! 325: The functions ! 326: \fInew-vector\fP, and ! 327: \fIvector\fP, can ! 328: be used to create vectors. ! 329: .(b ! 330: .TS ! 331: box center ; ! 332: c | c | c | c . ! 333: Subpart name Get value Set value Type ! 334: ! 335: = ! 336: datum[\fIi\fP] vref vset lispval ! 337: _ ! 338: property vprop vsetprop lispval ! 339: vputprop ! 340: _ ! 341: size vsize \- fixnum ! 342: .TE ! 343: .)b ! 344: .sh 3 array ! 345: Arrays are rather complicated types and are fully described in ! 346: Chapter 9. ! 347: An array consists of a block of contiguous data, a function ! 348: to access that data, and auxiliary fields for use by the accessing ! 349: function. ! 350: Since an array's accessing function is created by the user, an array can ! 351: have any form the user chooses (e.g. n-dimensional, triangular, or hash ! 352: table). ! 353: .br ! 354: Arrays are created by the function ! 355: .i marray . ! 356: .(b ! 357: .TS ! 358: box center ; ! 359: c | c | c | c . ! 360: Subpart name Get value Set value Type ! 361: ! 362: = ! 363: access function getaccess putaccess binary, list ! 364: or symbol ! 365: _ ! 366: auxiliary getaux putaux lispval ! 367: _ ! 368: data arrayref replace block of contiguous ! 369: set lispval ! 370: _ ! 371: length getlength putlength fixnum ! 372: _ ! 373: delta getdelta putdelta fixnum ! 374: .TE ! 375: .)b ! 376: .sh 3 value ! 377: A value cell contains a pointer to a lispval. ! 378: This type is used mainly by arrays of general lisp objects. ! 379: Value cells are created with the ! 380: .i ptr ! 381: function. ! 382: A value cell containing a pointer to the symbol `foo' is printed ! 383: as `(ptr\ to)foo' ! 384: .sh 3 hunk ! 385: A hunk is a vector of from 1 to 128 lispvals. ! 386: Once a hunk is created (by ! 387: .i hunk ! 388: or ! 389: .i makhunk ) ! 390: it cannot grow or shrink. ! 391: The access time for an element of a hunk is slower than a list cell element ! 392: but faster than an array. ! 393: Hunks are really only allocated in sizes which are powers of two, but ! 394: can appear to the user to be any size in the 1 to 128 range. ! 395: Users of hunks must realize that \fI(not\ (atom\ 'lispval))\fP ! 396: will return true if ! 397: .i lispval ! 398: is a hunk. ! 399: Most lisp systems do not have a direct test for a list cell and instead use ! 400: the above test and assume that ! 401: a true result means ! 402: .i lispval ! 403: is a list cell. ! 404: In ! 405: .Fr ! 406: you can use ! 407: .i dtpr ! 408: to check for a list cell. ! 409: Although hunks are not list cells, you can still access the first two ! 410: hunk elements with ! 411: .i cdr ! 412: and ! 413: .i car ! 414: and you can access any hunk element with ! 415: .i cxr \*[\(dg\*]. ! 416: .(f ! 417: \*[\(dg\*]In a hunk, the function ! 418: .i cdr ! 419: references the first element ! 420: and ! 421: .i car ! 422: the second. ! 423: .)f ! 424: You can set the value of the first two elements of a hunk with ! 425: .i rplacd ! 426: and ! 427: .i rplaca ! 428: and you can set the value of any element of the hunk with ! 429: .i rplacx . ! 430: A hunk is printed by printing its contents surrounded by { and }. ! 431: However a hunk cannot be read in in this way in the standard lisp system. ! 432: It is easy to write a reader macro to do this if desired. ! 433: .sh 3 other ! 434: Occasionally, you can obtain a pointer to storage not allocated ! 435: by the lisp system. One example of this is the entry field of ! 436: those ! 437: .Fr ! 438: functions written in C. Such objects are classified as of type ! 439: \fBother\fP. ! 440: Foreign functions which call malloc to allocate their own space, ! 441: may also inadvertantly create such objects. ! 442: The garbage collector is supposed to ignore such objects. ! 443: .sh 2 Documentation Conventions. ! 444: The conventions used in the following chapters were designed to ! 445: give a great deal of information in a brief ! 446: space. ! 447: The first line of a function description contains the function ! 448: name in \fBbold\ face\fP and then lists the arguments, if any. ! 449: The arguments all have names which begin with a letter or letters and ! 450: an underscore. ! 451: The letter(s) gives the allowable type(s) for that argument according to ! 452: this table. ! 453: .(b ! 454: .TS ! 455: box center ; ! 456: c | c ! 457: l | l . ! 458: Letter Allowable type(s) ! 459: ! 460: = ! 461: g any type ! 462: _ ! 463: s symbol (although nil may not be allowed) ! 464: _ ! 465: t string ! 466: _ ! 467: l list (although nil may be allowed) ! 468: _ ! 469: n number (fixnum, flonum, bignum) ! 470: _ ! 471: i integer (fixnum, bignum) ! 472: _ ! 473: x fixnum ! 474: _ ! 475: b bignum ! 476: _ ! 477: f flonum ! 478: _ ! 479: u function type (either binary or lambda body) ! 480: _ ! 481: y binary ! 482: _ ! 483: v vector ! 484: _ ! 485: V vectori ! 486: _ ! 487: a array ! 488: _ ! 489: e value ! 490: _ ! 491: p port (or nil) ! 492: _ ! 493: h hunk ! 494: .TE ! 495: .)b ! 496: In the first line of a function description, ! 497: those arguments preceded by a quote mark are evaluated (usually ! 498: before the function is called). ! 499: The quoting convention is used so that we can give a name to the result of ! 500: evaluating the argument and we can describe the allowable types. ! 501: If an argument is not quoted it does not mean that that argument will ! 502: not be evaluated, but rather that ! 503: if it is evaluated, the time at which it is evaluated ! 504: will be specifically mentioned in the function description. ! 505: Optional arguments are surrounded by square brackets. ! 506: An ellipsis (...) means zero or more occurrences of an argument of the ! 507: directly preceding ! 508: type.
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.