|
|
1.1 ! root 1: Changes to PEARL since the User's Manual. ! 2: ! 3: 6/26/83 -- Version 3.9: Misc. bug fixes -- distributed with 4.2. ! 4: -- Fixed a(n embarassingly) large number of bugs in the functions ! 5: relating to blocks and freezing and thawing variables. User visible ! 6: changes are that freezeblock and thawblock are now fexprs expecting ! 7: the name of the block to be frozen. Blocks without names cannot be ! 8: frozen or thawed individually. A prominent bug was also found in ! 9: freezebindings which did not work correctly when the structure being ! 10: frozen had no non-frozen variables of its own. ! 11: ! 12: 6/21/83 ! 13: -- Changed the name of the "selectq" in ucisubset.l to "selectq*" to ! 14: avoid the new Franz function "selectq" which requires the default case ! 15: to be labeled with "t" or "otherwise". Changed all PEARL code to use ! 16: the new Franz selectq. ! 17: ! 18: 5/14/83 -- Version 3.8: Unification added. ! 19: -- Added unification pattern matching as an option, using code written ! 20: by Dave Chin. To turn on unification, call the function "useunification". ! 21: There is currently no way to turn it off since the code as written ! 22: cannot handle old unification results if it doesn't think unification ! 23: is taking place (controlled by special variable *unifyunbounds*). ! 24: It is not as expensive as expected so this may be changed. ! 25: -- Also fixed serious bugs in "setv". ! 26: ! 27: 5/12/83 ! 28: -- Fixed bug in create which caused the mechanism of changing the type ! 29: of create being done in nested structures to fail. ! 30: ! 31: 5/6/83 ! 32: -- Fixed bug in printing of global adjunct variables. ! 33: ! 34: 5/1/83 ! 35: -- Fixed various major bugs in varreplace. ! 36: ! 37: 4/26/83 -- Version 3.7: Two part compilation and minor bug fixes ! 38: in scopy and hooks. ! 39: -- Created a way to do a "make" which compiles in two pieces for small ! 40: machines. Simply define "make pearl" as either "big" or "small" ! 41: depending on memory size (Less than about 2.5 Mb of memory requires ! 42: "small"). ! 43: -- Changed "scopy" and related functions so that the abbreviation on the ! 44: copy is just gensym'ed from the old abbreviation, without adding ":copy". ! 45: -- Fixed a bug in the hook functions which caused all slots after the ones ! 46: with hooks to execute the result (*done*, etc) of the first one. ! 47: ! 48: 3/28/83 -- Version 3.6: Inherit all slot hooks and predicates and unbind ! 49: incorrectly bound global variables after failed match. ! 50: --- Slot hooks are now always inherited and added to, rather than ! 51: replaced. If the hooks and predicates of a slot are preceded by "instead" ! 52: then inheriting doesn't happen and hooks and predicates are replaced. ! 53: --- Fixed match so that if an unbound global variable is set during a match ! 54: that later fails, the value is restored to *pearlunbound*. The names of ! 55: variables that are set are saved in the special variable *globalsavestack*. ! 56: ! 57: 3/18/83 -- Version 3.5: New print functions. ! 58: --- Rewrote all the print functions. Externally, the three old ! 59: pairs of functions: "valprint"/"valform", "fullprint"/"fullform", ! 60: and "abbrevprint"/"abbrevform" behave the same. However, there is now ! 61: a function called "allform" which all of these use which adjusts its ! 62: treatment of a structure based on several special atoms: ! 63: 1. *abbrevprint* -- non-nil value causes abbreviations to be used ! 64: whenever possible. "abbrevform" (and thus "abbrevprint") lambda-binds ! 65: this to t and calls "allform". "fullform" binds this to nil. ! 66: 2. *fullprint* -- non-nil value causes complete information ! 67: including hooks and predicates to be given when present. "fullform" ! 68: (and thus "fullprint") lambda-binds this to t and calls "allform". ! 69: "abbrevform" binds this to nil. ! 70: 3. *uniqueprint* -- described below. ! 71: 4. *quiet* -- described below. ! 72: "valform" lambda-binds both to nil which is their default values. ! 73: Thus, the default action of "allform" used by itself will be like "valform". ! 74: --- All the default print functions which used to use "valprint" ! 75: automatically now use "allprint" so that they can all be changed by ! 76: changes to the default values of *abbrevprint* and *fullprint*. ! 77: --- The third atom which affects the behavior of all the print functions ! 78: is *uniqueprint*. If it is given a non-nil value then if a structure ! 79: is encountered more than once during the same top-level call to a ! 80: print function, it will be translated into exactly the same cons-cells. ! 81: This saves on cons-cells and also makes it possible for the "*form" ! 82: functions to handle circular structures, although "sprint" and thus ! 83: the "*print" functions can't handle the result. Since most people ! 84: seldom have duplications within a structure, the default is OFF (nil). ! 85: The assoc list is stored in the special atom *uniqueprintlist*. ! 86: --- "form" and "print" functions were added to handle structures, ! 87: streams and symbols specially. They are called ! 88: "structureform", "structureprint" "symbolform", "symbolprint", ! 89: "streamform" and "streamprint" and do not ensure that you give them ! 90: the right type of value. ! 91: --- The fourth atom which affects the behavior of all the print ! 92: functions is *quiet* which, if non-nil, keeps them from running ! 93: either sprint or the *form function. This is helpful for when you ! 94: wish to turn off ALL printing in one fell swoop. A function called ! 95: "quiet" was also added which behaves like progn, except that it ! 96: lambda-binds *quiet* to t during the evaluation of its arguments, ! 97: provided a local island of "quiet". ! 98: ! 99: 3/8/83 -- Version 3.4: Type tags added. ! 100: --- Added a field to definitions, structures, symbols, and databases to ! 101: indicate what they were to speed up type checking. All relevant ! 102: functions related to structures and databases were changed. ! 103: --- Fixed some bugs in releasedb. ! 104: --- Many lowlevel functions in PEARL were changed, but none in ways that would ! 105: affect most people (because they shouldn't be using the changed functions). ! 106: ! 107: 3/4/83 -- Version 3.3: New faster hashing. ! 108: --- Changed internal code to do the hashing so that it only gets the value ! 109: out of a slot once instead of as many as 4 times as before. Resulted ! 110: in about a 5% speedup for structures only hashed a couple of ways. ! 111: Should be more for multiply hashed items. Should also make new ! 112: hashing methods easier to add. ! 113: ! 114: 2/25/83 -- Version 3.2: Slot encoding applied to speeded-up match. ! 115: --- Rewrote match functions to use the new slot encoding. Provided ! 116: about a 10% speedup. ! 117: --- There are now two different kinds of match function: "standardmatch" ! 118: and "basicmatch" will only match two structures of the same type. ! 119: "standardexpandedmatch" and "basicexpandedmatch" will match two ! 120: structures which are related hierarchically (one above the other) ! 121: on the slots they have in common. "standardfetch" uses the regular ! 122: versions and "expandedfetch" uses the expanded versions. ! 123: ! 124: 2/21/83 ! 125: --- Changed all special variables in PEARL to be defined with defvar so ! 126: that fasl'ing in pearl.o at compile time will automatically declare them ! 127: special again. ! 128: ! 129: 2/17/83 -- Version 3.1: Slot encoding for speed. ! 130: --- Added major and minor version numbers to PEARL, stored in ! 131: "pearlmajorversion" and "pearlminorversion" respectively. ! 132: Started at 3.1 for this version. ! 133: --- Added new method of storing in slots to speed up some things. ! 134: --- Putpath, delsetpath, addsetpath and clearpath now will work on a ! 135: slot with any kind of value or variable in it but result in a constant ! 136: value. This may cause problems, and if it does it will be "fixed" to ! 137: worry about what was there and decide what to do to it. ! 138: --- Scopy no longer throws away bound adjunct variables. ! 139: --- Many functions listed in the manual as being "proprietary" to PEARL ! 140: (i.e., not safe to use) have gone away. There are too many to list here. ! 141: ! 142: 1/23/83 ! 143: --- Fixed a bug which made slots inherit hashing when redescribed in an ! 144: expanded structure unless new hashing was specifically included. ! 145: --- Added a new "hashing mark" "+", for redescribed slots of expanded ! 146: structures only, which says copy the old info and add the following ! 147: new hashing too. It must come first to be effective. ! 148: Thus, the following should work: ! 149: (cb x (* a int)) ! 150: (ce x y (a ^)) ! 151: (ce x z (+ : a ^)) ! 152: (ce x w (: + a ^)) ;; anomalous use of + ! 153: resulting in: ! 154: * hashing in x, ! 155: no hashing in y, ! 156: both * and : hashing in z, ! 157: and only * hashing in w (because of misplacement of +). ! 158: ! 159: 1/19/83 ! 160: --- Merged the file sprint.l into ucisubset.l. ! 161: ! 162: 1/18/83 ! 163: --- Miscellaneous changes to functions length and others in ucisubset.l ! 164: to improve efficiency. ! 165: ! 166: 1/7/83 ! 167: --- Changed ,@ to ., in most cases (i.e., whenever equivalent) to ! 168: avoid an unneeded append generated by the backquote macro. ! 169: ! 170: 12/24/82 ! 171: --- Made change in the definitions of de, df, dm, drm and dsm so that ! 172: if the special variable *savedefs* is nil then old definitions of functions ! 173: are not saved. This is especially useful in compiling (and hence assembly ! 174: and loading) since it will speed it up quite a bit. The saving of the file ! 175: the definition was in is also disabled. The variable *savedefs* is ! 176: normally t which causes these macros to act as before, saving the ! 177: definition, etc. If *savedefs* is nil, then they simply expand into the ! 178: appropriate defun or setsyntax. The following lines should be ! 179: included in the file to have this effect only at compile time: ! 180: (eval-when (compile) ! 181: (declare (special *savedefs*)) ! 182: (setq *savedefs* nil)) ! 183: If you want to permanently disable the saving in your lisp, ! 184: simply put a ! 185: (setq *savedefs* nil) ! 186: in your .lisprc file AFTER the loading of ucisubset.l. ! 187: ! 188: 11/12/82 ! 189: --- Removed association of "remove" with Franz's "delete" so that ! 190: Franz's remove could be used and fixed all references to "remove" and ! 191: "dremove", changing many to "delq"s. ! 192: --- Deleted "powercopy" and redefinition of "copy" now that Franz has ! 193: correct meaning (doesn't attempt to copy hunks) for copy. ! 194: ! 195: 10/30/82 ! 196: --- All the exprs whose names were of the form XXXX1 where XXXX was the ! 197: name of a lexpr which was a principle function of PEARL were eliminated ! 198: (i.e., absorbed by the other form). ! 199: --- Many small changes to speed up PEARL, including: ! 200: 1. Changed many progs to lets. ! 201: 2. Inserted progn's around (or (non-error) ! 202: (not (msg t .....)) ! 203: (pearlbreak)) ! 204: thus eliminating the not and clarifying the meaning. ! 205: 3. Changed many pops to (setq x (cdr x)) (where popped item not wanted). ! 206: 4. Changed plus, difference, times and remainder to +&, -&, * and \\. ! 207: 5. Changed greaterp and lessp to >& and <&. ! 208: 6. Changed minusp to (<& .. 0) ! 209: 7. Changed (neq 0 ..) to (not (=& 0 ..)). ! 210: 8. Eliminated the intermediate exprs insertdb1, fetch1, etc. ! 211: by converting the basic functions insertdb, fetch to use the ! 212: &optional syntax. ! 213: PRELIMINARY RESULTS: ! 214: 25-33% speedup of various test programs. ! 215: ! 216: 10/20/82 ! 217: --- Added abbreviation "pdb" for "printdb". ! 218: --- Changed usage of nth, push and pop to use Franz Opus 38.32's new ! 219: definitions of them, removing them from ucisubset.l. ! 220: ! 221: 9/17/82 ! 222: --- Changed scopy, patternize and varreplace to exprs from macros ! 223: so that they will compile without complaints of special variables. ! 224: ! 225: 9/16/82 ! 226: --- Added new hashing mechanism using label && and called "hash ! 227: focusing". If this is found when inserting into the database ! 228: then the item is hashed as if it were the item in the slot so ! 229: labelled. This is designed for people using a data base all of ! 230: whose entries are of the same type (not required, just common ! 231: for this application) and enables the contents of a slot to be ! 232: more usefully used to discriminate them (e.g., planfors, inference ! 233: rules, or almost any such extremely-common binary predicates.) ! 234: At fetching time, && is considered less useful than *** or ** and more ! 235: useful than * or nothing (subject to debate and change). (This ! 236: necessitated the addition of an additional entry in the header of ! 237: structure definitions, moving everything else down a slot in the hunk.) ! 238: This differs from & (hash aliasing) in that && hash focussing affects ! 239: how a structure itself is inserted and fetched, while & simply ! 240: affects how structures containing this type of structure are ! 241: treated. For example, suppose the unique numbers of A, B, and C ! 242: respectively are 1, 2, and 3. C is a symbol. A has one slot X with ! 243: * and && hashing. B has one slot Y of type symbol with * hashing. ! 244: Then a structure like (A (X (B (Y C)))) will be indexed the ! 245: following ways and fetcheverywhere will find it in the following ! 246: order: ! 247: && which uses the 2 and 3 from B and its C, (ignoring the 1 of A), ! 248: and also simply 2 from B. ! 249: * on A uses type of B thus using 1 and 2. ! 250: also put under 1 of A without using 2 or 3. ! 251: If B had an & in its slot then the ! 252: * on A is affected by & on B thus using 1 and 3 (ignoring the 2 of B). ! 253: ! 254: Thus, if you consider A, B, and C to be three levels of information ! 255: in the structure, an item can be hashed under any combination of two ! 256: of those levels. The normal * method uses levels 1 and 2, the ! 257: aliasing & method ignores level 2 and uses levels 1 and 3, and the ! 258: new focussing && method ignores level 1 and uses levels 2 and 3. ! 259: In addition, the item can be put under 1, 2 or 3 individually by ! 260: various combinations of marks (1 = none, 2 = :, 3 = :+&). The only ! 261: unavailable combination of the 3 is all three. ! 262: ! 263: (Added internal-use-only functions are insertbyfocus, removebyfocus, ! 264: puthashfocus, gethashfocus, recursetoinsidestandardfetch. ! 265: ! 266: 9/15/82 ! 267: --- Added two functions "memmatch" and "memstrequal" which are like ! 268: "memq" except that they use "match" and "strequal" respectively ! 269: instead of "eq". ! 270: --- Added fixes to "scopy" and "patternize" from Dave Chin which allow ! 271: them to handle circularly linked structures AND to use the same copy ! 272: of the same structure wherever it appears. This required the addition ! 273: of a special variable *scopieditems*. This also included a bug fix ! 274: which added code to store pointers to the new copies in the ! 275: abbreviation atoms stored in them. ! 276: --- Added a function called "varreplace" similar to "patternize" which ! 277: replaces all bound variables in an item with their values, in effect ! 278: permanently freezing them. ! 279: --- Added a function called "(intscopy item outeritem)" where intscopy ! 280: stands for "internal scopy" exactly the same as "(scopy item)" except ! 281: it does the copying as if the item were internal to outeritem, thus ! 282: sharing its local and block variables. ! 283: --- Split create.l into create.l and scopy.l. ! 284: ! 285: 9/14/82 ! 286: --- Moved much of the initialization stuff out of pearl-top-level-init ! 287: to be done at load time instead. This cut the minimum startup cost ! 288: for PEARL from 4 seconds to 0.8 seconds CPU. ! 289: --- Changed setdbsize to remove all current databases before changing ! 290: the size, warn if *warn* is set and recreate *maindb* with *db* ! 291: pointing to it. Also fixed a bug when removing the last database. ! 292: --- Changed the init-files processing to parallel the new Franz method, ! 293: looking in the current directory, and then the home directory, and ! 294: looking for .init.prl followed by .o, .l or nothing, and then init.prl ! 295: followed by .o, .l or nothing. Similarly for start.prl. ! 296: --- Fixed cleardb so that it doesn't make new cons-cells for the buckets ! 297: and so that it uses connectdb if the database has a parent. Thus, ! 298: cleardb is a local database clearer and its effects do not extend up ! 299: the DB hierarchy. ! 300: ! 301: 6/6/82 ! 302: Added new hashing method. If slots are labelled with *** and all ! 303: slots so marked are filled with useful values, then the item is hashed ! 304: under the type of structure plus the values of all these slots. ! 305: New functions are gethashmulti and puthashmulti. *multiproducts* is a ! 306: new special atom containing the numbers to multiply the various values ! 307: with to produce the index (currently powers of 16). ! 308: ! 309: 6/3/82 ! 310: Fixed a bug in fetcheverywhere which caused it to only find the ! 311: bucket for the first *-ed slot, instead of all of them. (Added ! 312: to npearl also). ! 313: ! 314: 5/28/82 ! 315: Tried replacing the sequential search method of finding slot numbers ! 316: for particular slot names with evaluating a concat'ed atom made out ! 317: of <typename ":" slotname> but timings found it slower so it was ! 318: removed. ! 319: ! 320: 5/27/82 ! 321: Fixed a problem with storage of variables. Instead of two spots in ! 322: the hunk, one for the alist (unfrozen variables) and one for the ! 323: alistcp (frozen variables), there is a special cons cell with these ! 324: in its car and cdr. This cons cell is pointed to by all substructures ! 325: so that they can be used in fetches and matches and will be able to ! 326: unbind or freeze or thaw their variables. Additional special variable ! 327: is *toplevelalists* (or some such). ! 328: ! 329: 5/6/82 ! 330: --- When an individual (including default instance) structure is created, ! 331: an abbreviation atom is stored in it. This abbreviation is chosen as ! 332: follows: ! 333: 1. If the option of having a structure stored in an atom is used, ! 334: then that atom is the one used as an abbreviation. Thus ! 335: (create individual x Pete) ! 336: will have Pete as a abbreviation. ! 337: 2. If that option isn't used, then default instances will be ! 338: given the abbreviation i:x (where x is the structure type name) ! 339: and individuals at the top level will be given a name newsym-ed ! 340: from the name of their type. Thus ! 341: (create base x) will make a default instance abbreviated i:x and ! 342: (create individual x) will be abbreviated x0 or x1 or whatever. ! 343: --- New printing and "form-type" functions were added called "abbrevprint" ! 344: and "abbrevform" which print the abbreviation (if there is one) for ! 345: any structure below the top level. ! 346: --- The base name of the type of a slot (i.e., the last word, after ! 347: setof's are stripped off) is stored for each slot (a more general ! 348: application of the "ppset" information always stored for integer slots ! 349: with ordinal types before). This is in preparation for two things: ! 350: 1. Enforcing such type descriptions. ! 351: 2. Generating knowledge about the slots of a structure so that the ! 352: user need not know whether to use fetch or path. ! 353: ! 354: 5/5/82 ! 355: The name of an old slot in a new expanded may be changed by following ! 356: the new name by the old slotname preceded with an equal sign. Thus ! 357: for example: ! 358: pearl> (create base X ! 359: (A struct)) ! 360: (X (A (nilstruct))) ! 361: pearl> (create expanded X Y ! 362: (B =A) ! 363: (C .....)) ! 364: (Y (B (nilstruct)) (C .....))) ! 365: ! 366: NOTE that there MAY NOT be a space between the equal sign and the A ! 367: since = is the read macro which expands =A into (*slot* A) but leaves ! 368: a single space-surrounded = alone. ! 369: ! 370: 4/28/82 ! 371: --- Adapted PEARL to fit Franz Opus 38.13 so that the atoms ! 372: showstack-printer and trace-printer are bound to the functions ! 373: pearlshowstackprintfn and pearltraceprintfn. (Note the addition of ! 374: "pearl" to the beginning of these). Also changed the name of ! 375: breakprintfn to pearlbreakprintfn but it is not currently ! 376: lambda-bindable. ! 377: --- Adapted the reading of .init.prl and .start.prl files to disable ! 378: the printing of "[load .init.prl]" by lambda-binding $ldprint to nil ! 379: first (Franz Opus 38.14). ! 380: ! 381: 2/22/82 ! 382: --- Fixed a bug in the hook disablers. The atoms for path hooks ! 383: were misnamed in such a way that you couldn't use hidden and ! 384: visible. Instead of *rungethooks*, and other *run...hooks* ! 385: forms, they are now *rungetpathhooks* and other *run...pathhooks*. ! 386: Note that they must be called as (XXXpath ...) and not (path XXX ...) ! 387: when used with hidden and visible. ! 388: ! 389: 2/21/82 ! 390: --- Added ability to evaluate an atom when expecting a value of a ! 391: different type (besides integers which already worked this way). ! 392: For symbols, this is done if the atom isn't a symbol name. ! 393: For structures, it must evaluate to a structure. ! 394: For Lisp slots, it may not evaluate to an atom. ! 395: For setof slots, its value is checked for being of the appropriate ! 396: type, including depth of nesting. ! 397: --- Added the fetching function "fetcheverywhere" which gathers ! 398: ALL the buckets the object could have been hashed into and builds ! 399: a stream out of all of them (potentially five buckets). Will wait ! 400: to build an "expandedfetcheverywhere" with its potential of ! 401: returning 5 times the-depth-of-the-hierarchy buckets. ! 402: ! 403: vi: set lisp:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.