00001 00009 #ifndef CONS_HPP 00010 #define CONS_HPP 00011 00012 #include <iostream> 00013 #include "Cell.hpp" 00014 00015 using namespace std; 00016 00020 extern Cell* const nil; 00021 00026 inline Cell* make_int(const int i) 00027 { 00028 return new IntCell(i); 00029 } 00030 00035 inline Cell* make_double(const double d) 00036 { 00037 return new DoubleCell(d); 00038 } 00039 00044 inline Cell* make_symbol(const char* const s) 00045 { 00046 return new SymbolCell(s); 00047 } 00048 00054 inline Cell* cons(Cell* const my_car, Cell* const my_cdr) 00055 { 00056 return new ConsCell(my_car, my_cdr); 00057 } 00058 00064 inline Cell* lambda(Cell* const my_formals, Cell* const my_body) 00065 { 00066 return new ProcedureCell(my_formals, my_body); 00067 } 00068 00073 inline bool nullp(Cell* const c) 00074 { 00075 return (c == nil); 00076 } 00077 00082 inline bool listp(Cell* const c) 00083 { 00084 return nullp(c) || c->is_cons(); 00085 } 00086 00091 inline bool procedurep(Cell* const c) 00092 { 00093 return !nullp(c) && c->is_procedure(); 00094 } 00095 00100 inline bool intp(Cell* const c) 00101 { 00102 return !nullp(c) && c->is_int(); 00103 } 00104 00109 inline bool doublep(Cell* const c) 00110 { 00111 return !nullp(c) && c->is_double(); 00112 } 00113 00118 inline bool symbolp(Cell* const c) 00119 { 00120 return !nullp(c) && c->is_symbol(); 00121 } 00122 00127 inline int get_int(Cell* const c) 00128 { 00129 return c->get_int(); 00130 } 00131 00136 inline double get_double(Cell* const c) 00137 { 00138 return c->get_double(); 00139 } 00140 00146 inline string get_symbol(Cell* const c) 00147 { 00148 return c->get_symbol(); 00149 } 00150 00155 inline Cell* car(Cell* const c) 00156 { 00157 return c->get_car(); 00158 } 00159 00164 inline Cell* cdr(Cell* const c) 00165 { 00166 return c->get_cdr(); 00167 } 00168 00174 inline Cell* get_formals(Cell* const c) 00175 { 00176 return c->get_formals(); 00177 } 00178 00184 inline Cell* get_body(Cell* const c) 00185 { 00186 return c->get_body(); 00187 } 00188 00194 inline ostream& operator<<(ostream& os, const Cell& c) 00195 { 00196 c.print(os); 00197 return os; 00198 } 00199 00200 #endif // CONS_HPP