|
|
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.