APPENDIX C Short Subjects. The Garbage Collector The garbage collector is invoked automatically whenever a collectable data type runs out. All data types are col- lectable except strings and atoms are not. After a garbage collection finishes, the collector will call the function _g_c_a_f_t_e_r which should be a lambda of one argument. The argu- ment passed to _g_c_a_f_t_e_r is the name of the data type which ran out and caused the garbage collection. It is _g_c_a_f_t_e_r's responsibility to allocate more pages of free space. The default _g_c_a_f_t_e_r makes its decision based on the percentage of space still in use after the garbage collection. If there is a large percentage of space still in use, _g_c_a_f_t_e_r allocates a larger amount of free space than if only a small percentage of space is still in use. The default _g_c_a_f_t_e_r will also print a summary of the space in use if the vari- able $_g_c_p_r_i_n_t is non nil. The summary always includes the state of the list and fixnum space and will include another type if it caused the garbage collection. The type which caused the garbage collection is preceded by an asterisk. Debugging There are two simple functions to help you debug your programs: _b_a_k_t_r_a_c_e and _s_h_o_w_s_t_a_c_k. When an error occurs (or when you type the interrupt character), you will be left at a break level with the state of the computation frozen in the stack. At this point, calling the function _s_h_o_w_s_t_a_c_k will cause the contents of the lisp evaluation stack to be printed in reverse chronological order (most recent first). When the programs you are running are interpreted or traced, the output of _s_h_o_w_s_t_a_c_k can be very verbose. The function _b_a_k_t_r_a_c_e prints a summary of what _s_h_o_w_s_t_a_c_k prints. That is, if showstack would print a list, _b_a_k_t_r_a_c_e would only print the first element of the list. If you are running compiled code with the (_s_t_a_t_u_s _t_r_a_n_s_l_i_n_k) non nil, then fast links are being made. In this case, there is not enough information on the stack for _s_h_o_w_s_t_a_c_k and _b_a_k_t_r_a_c_e. Thus, if you are debugging compiled code you should probably do (_s_s_t_a_t_u_s _t_r_a_n_s_l_i_n_k _n_i_l). 9 9 C-1 C-2 If the contents of the stack don't tell you enough about your problem, the next thing you may want to try is to run your program with certain functions traced. You can direct the trace package to stop program execution when it enters a function, allowing you to examine the contents of variables or call other functions. The trace package is documented in Chapter 11. It is also possible to single step the evaluator and to look at stack frames within lisp. The programs which per- form these actions are described in Chapters 14 and 15. 9 9 Printed: July 21, 1983 C-3 The Interpreter's Top Level The default top level interpreter for Franz, named _f_r_a_n_z-_t_o_p-_l_e_v_e_l is defined in /usr/lib/lisp/toplevel.l It is given control when the lisp system starts up because the variable top-level is bound to the symbol _f_r_a_n_z-_t_o_p-_l_e_v_e_l. The first action _f_r_a_n_z-_t_o_p-_l_e_v_e_l takes is to print out the name of the current version of the lisp system. Then it loads the file .lisprc from the HOME directory of the person invoking the lisp system if that file exists. The .lisprc file allows you to set up your own defaults, read in files, set up autoloading or anything else you might want to do to personalize the lisp system. Next, the top level goes into a prompt-read-eval-print loop. Each time around the loop, before printing the prompt it checks if the variable user- top-level is bound. If so, then the value of user-top-level will be _f_u_n_c_a_l_led. This provides a convenient way for a user to introduce his own top level (Liszt, the lisp com- piler, is an example of a program which uses this). If the user types a ^D (which is the end of file character), and the standard input is not from a keyboard, the lisp system will exit. If the standard input is a keyboard and if the value of (_s_t_a_t_u_s _i_g_n_o_r_e_e_o_f) is nil, the lisp system will also exit. Otherwise the end of file will be ignored. When a _r_e_s_e_t is done the current value of _e_r_r_l_i_s_t is saved away and control is thrown back up to the top level where _e_v_a_l is mapped over the saved value of _e_r_r_l_i_s_t. 9 9 Printed: July 21, 1983