// Symbol Code. // // File: symbol.cc // Author: {your name} <{your e-mail address}> // Assignment: 7, 9 #include "symbol.h" #include "obtype.h" #include "preserve.h" #include "gc.h" class symbol_type : public object_type { public: symbol_type () : object_type ("SYMBOL") {} // Construct object type with simple free and // used lists and the name "SYMBOL". virtual void initialize(); // Initialize T, :TEST, TOP_LEVEL, etc. virtual void mark(); // Mark symbols. friend symbol * make_symbol (char * name); }; object_type * SYMBOL_TYPE = (object_type *) new symbol_type; // Create a symbol with a give name. // symbol * make_symbol (char * name) { // ***** Write symbol allocator here for ***** // ***** assignment 7, and modify for ***** // ***** assignment 9 gc ***** static symbol dummy; dummy.init_object (SYMBOL_TYPE); return &dummy; } object * NIL; object * T; object * TEST; object * TOP_LEVEL; object * TRACE; object * STEP; // Initialize NIL, T, .... // void symbol_type::initialize() { T = make_symbol ("T"); set_symbol_value (unchecked_must_be_symbol(T), T); TEST = make_symbol (":TEST"); set_symbol_value (unchecked_must_be_symbol(TEST), TEST); TRACE = make_symbol ("*TRACE*"); set_symbol_value (unchecked_must_be_symbol(TRACE), NIL); STEP = make_symbol ("*STEP*"); set_symbol_value (unchecked_must_be_symbol(STEP), NIL); TOP_LEVEL = make_symbol ("TOP-LEVEL"); } // Print symbol. // ostream& symbol::print (ostream& s) { return s << name; } // Scavenge symbol. // void symbol::scavenge() { // ***** Put gc code here for assignment 9 ***** } // Mark symbols. // void symbol_type::mark() { // ***** Put gc code here for assignment 9 ***** } // A function to help LISP interpreter initialization by // preserving all symbols defined during program // initialization before main is called. Preserve is // called for all existing symbols. // void preserve_all_existing_symbols() { for ( object * ob = SYMBOL_TYPE->used_list; ob != NULL; ob = ob->link ) preserve (ob); }