The attached patch does print and read of hashtables. It respects print-length only, exactly like vector print and consistent with the rest of GNU Emacs. Please review and comment. Some notes: I ended up with this code to put a list into Fmake_hash_table format ('params' is a Lisp_Object that holds a bunch of conses). int param_count = 0; Lisp_Object *pa = (Lisp_Object*) xmalloc(XFASTINT(Flength(params)) * sizeof(Lisp_Object)); while (!NILP(params)) { pa[param_count++] = CAR_SAFE(params); params = CDR_SAFE(params); } Lisp_Object ht = Fmake_hash_table(param_count, pa); I would prefer it if I could avoid all that work, but it seems (from reading lisp.h and hunting for similar code) that it must be done as above. I don't see a macro to convert a Lisp_Object that holds a list into the Lisp_Object* that a lot of functions need. Also I don't know if what xmalloc() gives needs to be freed eventually. To generate the Lisp symbol ":size" from the symbol "size" for example, I used: Lisp_Object colon = make_string (":", 1); intern(SDATA(concat2(colon, SYMBOL_NAME(head)))) I don't know if there's a better way, but this works. Thanks! Ted