   return pgm_read_word(&lookup_table[name].max);
 }
 
-char *lookupstring (symbol_t name) {
+char *lookupbuiltin (symbol_t name) {
+  char *buffer = SymbolTop;
   strcpy_P(buffer, (char *)(pgm_read_word(&lookup_table[name].string)));
   return buffer;
+}
+
+char *lookupsymbol (symbol_t name) {
+  char *p = SymbolTable;
+  int i=name-64000;
+  while (i > 0 && p < SymbolTop) {p = p + strlen(p) + 1; i--; }
+  if (p == SymbolTop) return NULL; else return p;
+}
+
+void deletesymbol (symbol_t name) {
+  char *p = lookupsymbol(name);
+  if (p == NULL) return;
+  char *q = p + strlen(p) + 1;
+  *p = '\0'; p++;
+  while (q < SymbolTop) *(p++) = *(q++);
+  SymbolTop = p;
 }
 
 // Main evaluator

  initworkspace();
  initenv();
  _end = 0xA5;      // Canary to check stack
  pfstring(F("uLisp 1.7")); pln();
}

// Read/Evaluate/Print loop

}

char *name (object *obj){
  char *buffer = SymbolTop;
  buffer[3] = '\0';
  if(obj->type != SYMBOL) error(F("Error in name"));
  symbol_t x = obj->name;
  if (x < ENDFUNCTIONS) return lookupbuiltin(x);
  else if (x >= 64000) return lookupsymbol(x);
  for (int n=2; n>=0; n--) {
    buffer[n] = fromradix40(x % 40);
    x = x / 40;
