ptr print(ptr p){ if(p==nil){ printf("()"); return nil; } switch(p->tag){ case 0: //リストのprint putchar('(');//先頭の(の印刷 print_cons(p);//リストの項目を印刷する。 break; case 1: //int printf("%d ",p->data.num); break; case 2: //symbol printf("%s ",p->data.symbol.name); break; default: printf("Abnormal data! Fatal!\n"); exit(1); } return nil; }
void Printer::print(LispObjRef obj) { if (is_nil(obj)) output_ << "NIL"; else if (is_fixnum(obj)) output_ << get_ctype<FixnumType>(obj); // (CFixnum)(boost::get<FixnumType>(*obj)); else if (is_floatnum(obj)) output_ << get_ctype<FloatnumType>(obj); //(CFloatnum)(boost::get<FloatnumType>(*obj)); else if (is_string(obj)) output_ << "\"" << get_ctype<StringType>(obj) << "\""; // ""(CString)(boost::get<StringType>(*obj)) << "\""; else if (is_symbol(obj)) output_ << get_ctype<SymbolType>(obj).name; // static_cast<LispSymbol>(boost::get<SymbolType>(*obj)).first; else if (is_cons(obj)) { output_ << "("; print_cons(obj); output_ << ")"; } else if (is_char(obj)) { CChar c = get_ctype<CharType>(obj); if (isprint(c)) { output_ << c; } else { output_ << "#" << std::hex << (int) c << std::dec; } } else output_ << "#UNPRINTABLE#"; }
void print_table(hash_table* ht) { int i, n = ht->hash_div; cons** table = ht->table; for (i = 0; i < n; i++) { if (table[i] != NULL) { print_cons(table[i]); } } }
void print_cons(cons* list) { if (list == NULL) { printf("NULL\n"); } else { printf("%s : %d\n", list->str, list->car); if (list->cdr != NULL) { print_cons(list->cdr); } } }
/* Print consequences of all fired rules */ void print_results(void) { register int i; char c; _clearscreen(_GCLEARSCREEN); for (i = 0; i < RULE_NUM; i++) if (get_rb_fire_flag(i)) print_cons(i); printf("\n\t============Press a key to continue==============="); c = getch(); }
void Printer::print_cons(LispObjRef obj) { print(car(obj)); LispObjRef next(cdr(obj)); if (is_cons(next)) { output_ << " "; print_cons(next); return; } if (is_nil(next)) { return; } output_ << " . "; print(next); }
ptr print_cons(ptr p){ // p is cons ptr next; print(car(p)); //これはprintでないといけない。 next=cdr(p); if(next==nil) putchar(')'); else if(next->tag==0){ //list が続く print_cons(next); } else{ //非真性リスト printf(" . "); print(next); putchar(')'); } return nil; }