shithub: femtolisp

Download patch

ref: e8d69c4cd659cee7e94e8fb024a0cd26c05d277f
parent: e731ef03287102cc360f9058afb76ff845fa6aab
author: Sigrid Solveig Haflínudóttir <sigrid@ftrv.se>
date: Thu Nov 7 13:42:58 EST 2024

stop with the curr_func stuff, leave the proper stack trace construction to system.lsp

--- a/cvalues.c
+++ b/cvalues.c
@@ -198,23 +198,6 @@
 	return cv;
 }
 
-char *
-cvalue_cbuiltin_name(value_t v)
-{
-	cvalue_t *cv = ptr(v);
-	static char name[128];
-	value_t label;
-
-	void *data = cptr(v);
-	void *fptr = *(void**)data;
-	label = (value_t)ptrhash_get(&reverse_dlsym_lookup_table, cv);
-	if(label == (value_t)HT_NOTFOUND)
-		snprintf(name, sizeof(name), "#<builtin @%p>", fptr);
-	else
-		snprintf(name, sizeof(name), "#fn(%s)", symbol_name(label));
-	return name;
-}
-
 value_t
 cvalue_string(size_t sz)
 {
--- a/cvalues.h
+++ b/cvalues.h
@@ -37,7 +37,6 @@
 #define cvalue_nofinalizer(type, sz) cvalue_(type, sz, true)
 value_t cvalue_from_data(fltype_t *type, void *data, size_t sz);
 value_t cvalue_from_ref(fltype_t *type, void *ptr, size_t sz, value_t parent);
-char *cvalue_cbuiltin_name(value_t v);
 value_t cvalue_string(size_t sz);
 value_t cvalue_static_cstring(const char *str);
 value_t string_from_cstrn(char *str, size_t n);
--- a/flisp.boot
+++ b/flisp.boot
@@ -19,43 +19,46 @@
 	      #fn("8000n30182p:" #()) 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
 	      0 0 0 0 0 0 0 0 0 0 0)
 	    *interactive* #f *syntax-environment*
-	    #table(letrec #fn("?000|1202021e12223052e122240522515154e1222605262:" #(#fn(nconc)
-  λ #fn(map) #.car #fn("9000n12021e12205162:" #(#fn(nconc) set! #fn(copy-list)))
-  #fn(copy-list) #fn("6000n17060:" #(void))))  quasiquote #fn("8000n1700E62:" #(bq-process))  when #fn("<000|1200211POe4:" #(if
-  begin))  unwind-protect #fn("8000n220>2150215062:" #(#fn("@000n220121qFe3e2e12223A210e1241e1250e2e3e3e31e1e3e3:" #(let
-  λ prog1 trycatch begin raise)) #fn(gensym)))  dotimes #fn(";000|120>0<0T62:" #(#fn("=000n220E211Ke32223e10e1e124F5153e4:" #(for
-  - #fn(nconc) λ #fn(copy-list)))))  define-macro #fn("?000|120210<e22223e10=e12415153e3:" #(set-syntax!
-  quote #fn(nconc) λ #fn(copy-list)))  receive #fn("@000|22021q1e32221e10e123825153e3:" #(call-with-values
-  λ #fn(nconc) #fn(copy-list)))  unless #fn("=000|1200O211Pe4:" #(if begin))  let* #fn("A000|10H3E02021e1qe12215153e1:2021e173051e1e1220=B3H02024e10=e12215153e1@301515375051e2:" #(#fn(nconc)
-  λ #fn(copy-list) caar let* cadar))  case #fn(":000|120>D61:" #(#fn("7000n120?0421>225061:" #(#fn("9000n2120C5020:1J40O:1R3=021072151e3:1H3=023072151e3:1=J>0230721<51e3:74251523=0260271e2e3:280271e2e3:" #(else
-  eq? quote-value eqv? every #.symbol? memq quote memv) vals->cond)
-  #fn("<000n1200910e2e12122e12324>9115252e3:" #(let #fn(nconc) cond #fn(map)
-						#fn("8000n1910A0<520=P:" #())))
-  #fn(gensym)))))  catch #fn("7000n220>215061:" #(#fn("@000n120F210e12223240e225260e22728e2e325290e2Ae3e42:0e22;0e2e4e3e3:" #(trycatch
-  λ if and pair? eq car quote thrown-value cadr caddr raise))
-						  #fn(gensym)))  assert #fn("<000n1200D2122230e2e2e2e4:" #(if
-  raise quote assert-failed))  do #fn("A000|220>21501<22230522224052222505265:" #(#fn("B000n520021822212324e125F=51522324e12590251230e18452e153e4e3e2e1230e18352e3:" #(letrec
-  λ if #fn(nconc) begin #fn(copy-list))) #fn(gensym)
-  #fn(map) #.car #.cadr #fn("7000n170051B38071061:0<:" #(cddr caddr))))  with-input-from #fn("=000|12021e1220e2e1e12315163:" #(#fn(nconc)
-  with-bindings *input-stream* #fn(copy-list)))  let #fn(":000|120>O61:" #(#fn("<000n1AR3D0A?04F<z004F=z01@30D420>2122e12324A52e125F51532326A5262:" #(#fn("8000n2A3@020A0e2e1Ae3@3001P:" #(letrec))
-  #fn(nconc) λ #fn(map) #fn("6000n10B3500<:0:" #())
-  #fn(copy-list) #fn("6000n10B3500T:7060:" #(void))))))  cond #fn("9000|020>D61:" #(#fn("7000n120>?040A61:" #(#fn("7000n10H340O:20>0<61:" #(#fn(":000n10<20Q;I7040<DQ3@00=J500<:210=P:0=J@0220<910A=51e3:0T23CW07475051513A026>77750515161:28>295061:2:0<210=P910A=51e4:" #(else
+	    #table(with-input-from #fn("=000|12021e1220e2e1e12315163:" #(#fn(nconc)
+  with-bindings *input-stream* #fn(copy-list)))  unless #fn("=000|1200O211Pe4:" #(if
+  begin))  time #fn("7000n120>215061:" #(#fn(">000n120021e1e2e122A23242521e10e326e4e3e3:" #(let
+  time-now prog1 princ "Elapsed time: " - " seconds\n"))
+					 #fn(gensym)))  cond #fn("9000|020>D61:" #(#fn("7000n120>?040A61:" #(#fn("7000n10H340O:20>0<61:" #(#fn(":000n10<20Q;I7040<DQ3@00=J500<:210=P:0=J@0220<910A=51e3:0T23CW07475051513A026>77750515161:28>295061:2:0<210=P910A=51e4:" #(else
   begin or => 1arg-lambda? caddr #fn("=000n1200A<e2e1210227374A5151P920910=51e4e3:" #(let
   if begin cddr caddr)) caadr #fn("<000n1200A<e2e121072A510e2920910=51e4e3:" #(let
-  if caddr)) #fn(gensym) if))) cond-clauses->if)))))  throw #fn(":000n220212223e201e4e2:" #(raise
-  list quote thrown-value))  time #fn("7000n120>215061:" #(#fn(">000n120021e1e2e122A23242521e10e326e4e3e3:" #(let
-  time-now prog1 princ "Elapsed time: " - " seconds\n"))
-							   #fn(gensym)))  with-output-to #fn("=000|12021e1220e2e1e12315163:" #(#fn(nconc)
-  with-bindings *output-stream* #fn(copy-list)))  with-bindings #fn(">000|120>21220522123052212405263:" #(#fn("B000n32021e1222382053e1242225015351262027e124F51522027e1242228082535152e3e164:" #(#fn(nconc)
+  if caddr)) #fn(gensym) if))) cond-clauses->if)))))  do #fn("A000|220>21501<22230522224052222505265:" #(#fn("B000n520021822212324e125F=51522324e12590251230e18452e153e4e3e2e1230e18352e3:" #(letrec
+  λ if #fn(nconc) begin #fn(copy-list))) #fn(gensym)
+  #fn(map) #.car #.cadr #fn("7000n170051B38071061:0<:" #(cddr caddr))))  with-bindings #fn(">000|120>21220522123052212405263:" #(#fn("B000n32021e1222382053e1242225015351262027e124F51522027e1242228082535152e3e164:" #(#fn(nconc)
   let #fn(map) #.list #fn(copy-list) #fn("8000n22001e3:" #(set!))
   unwind-protect begin #fn("8000n22001e3:" #(set!))))
-  #fn(map) #.car #.cadr #fn("6000n12060:" #(#fn(gensym))))))
+  #fn(map) #.car #.cadr #fn("6000n12060:" #(#fn(gensym)))))  let #fn(":000|120>O61:" #(#fn("<000n1AR3D0A?04F<z004F=z01@30D420>2122e12324A52e125F51532326A5262:" #(#fn("8000n2A3@020A0e2e1Ae3@3001P:" #(letrec))
+  #fn(nconc) λ #fn(map) #fn("6000n10B3500<:0:" #())
+  #fn(copy-list) #fn("6000n10B3500T:7060:" #(void))))))  define-macro #fn("?000|120210<e22223e10=e12415153e3:" #(set-syntax!
+  quote #fn(nconc) λ #fn(copy-list)))  quasiquote #fn("8000n1700E62:" #(bq-process))  when #fn("<000|1200211POe4:" #(if
+  begin))  with-output-to #fn("=000|12021e1220e2e1e12315163:" #(#fn(nconc)
+								with-bindings
+								*output-stream*
+								#fn(copy-list)))  catch #fn("7000n220>215061:" #(#fn("@000n120F210e12223240e225260e22728e2e325290e2Ae3e42:0e22;0e2e4e3e3:" #(trycatch
+  λ if and pair? eq car quote thrown-value cadr caddr raise))
+  #fn(gensym)))  let* #fn("A000|10H3E02021e1qe12215153e1:2021e173051e1e1220=B3H02024e10=e12215153e1@301515375051e2:" #(#fn(nconc)
+  λ #fn(copy-list) caar let* cadar))  letrec #fn("?000|1202021e12223052e122240522515154e1222605262:" #(#fn(nconc)
+  λ #fn(map) #.car #fn("9000n12021e12205162:" #(#fn(nconc) set! #fn(copy-list)))
+  #fn(copy-list) #fn("6000n17060:" #(void))))  assert #fn("<000n1200D2122230e2e2e2e4:" #(if
+  raise quote assert-failed))  case #fn(":000|120>D61:" #(#fn("7000n120?0421>225061:" #(#fn("9000n2120C5020:1J40O:1R3=021072151e3:1H3=023072151e3:1=J>0230721<51e3:74251523=0260271e2e3:280271e2e3:" #(else
+  eq? quote-value eqv? every #.symbol? memq quote memv) vals->cond)
+  #fn("<000n1200910e2e12122e12324>9115252e3:" #(let #fn(nconc) cond #fn(map)
+						#fn("8000n1910A0<520=P:" #())))
+  #fn(gensym)))))  receive #fn("@000|22021q1e32221e10e123825153e3:" #(call-with-values
+  λ #fn(nconc) #fn(copy-list)))  unwind-protect #fn("8000n220>2150215062:" #(#fn("@000n220121qFe3e2e12223A210e1241e1250e2e3e3e31e1e3e3:" #(let
+  λ prog1 trycatch begin raise)) #fn(gensym)))  dotimes #fn(";000|120>0<0T62:" #(#fn("=000n220E211Ke32223e10e1e124F5153e4:" #(for
+  - #fn(nconc) λ #fn(copy-list)))))  throw #fn(":000n220212223e201e4e2:" #(raise
+  list quote thrown-value)))
 	    1+ #fn("7000n10KM:" #() 1+) 1-
 	    #fn("7000n10K\x80:" #() 1-) 1arg-lambda? #fn("8000n10B;3^040<20Q;I8040<20Q;3J040=B;3B040TB;3:04710TK62:" #(λ
   length=) 1arg-lambda?)
 	    <= #fn("7000n210L;IB0470051;380470151S:" #(nan?) <=) >
 	    #fn("7000n210L:" #() >) >= #fn("7000n201L;IB0470051;380470151S:" #(nan?) >=)
-	    Instructions #table(not 35  vargc 76  load1 27  = 60  setc.l 75  sub2 80  brne.l 85  largc 81  brnn 26  loadc.l 70  loadi8 66  < 28  nop 46  set-cdr! 30  loada 8  neg 37  bound? 42  / 58  brn.l 88  lvargc 82  brt 25  trycatch 77  null? 38  load0 21  jmp.l 48  loadv 2  seta 15  keyargs 91  * 57  function? 44  builtin? 43  aref 23  optargs 89  loadt 20  vector? 45  cdr 13  brf 3  loadc00 17  symbol? 34  cadr 36  pop 4  pair? 18  for 78  closure 14  loadf 31  compare 61  loadv.l 67  setg.l 72  brn 87  eqv? 51  aset! 64  atom? 24  eq? 33  boolean? 39  brt.l 50  tapply 79  dummy_nil 94  loada0 0  brbound 90  dup 11  loadc01 22  list 53  loadc 9  apply 54  dummy_t 93  setg 71  loada1 1  tcall.l 84  jmp 16  fixnum? 41  cons 32  loadg.l 68  tcall 6  dummy_eof 95  call 5  - 56  brf.l 49  + 55  dummy_f 92  add2 29  seta.l 73  loadnil 65  brnn.l 86  setc 74  set-car! 47  loadg 7  vector 63  loada.l 69  argc 62  div0 59  ret 10  car 12  number? 40  equal? 52  call.l 83  brne 19)
+	    Instructions #table(call.l 83  largc 81  trycatch 77  loadg.l 68  cadr 36  setg 71  argc 62  load0 21  vector? 45  fixnum? 41  loada0 0  div0 59  keyargs 91  call 5  loada.l 69  brt.l 50  pair? 18  sub2 80  add2 29  loadc.l 70  loadc 9  builtin? 43  set-car! 47  brt 25  loadi8 66  tapply 79  ret 10  loada1 1  boolean? 39  cdr 13  atom? 24  brne.l 85  / 58  loadf 31  equal? 52  apply 54  jmp.l 48  loadt 20  dup 11  = 60  not 35  null? 38  set-cdr! 30  loadc01 22  eq? 33  * 57  load1 27  dummy_t 93  bound? 42  brf 3  function? 44  setc.l 75  < 28  brnn.l 86  for 78  loadv 2  jmp 16  lvargc 82  dummy_eof 95  + 55  dummy_f 92  setc 74  brne 19  compare 61  neg 37  loadv.l 67  brn 87  vargc 76  number? 40  brbound 90  vector 63  setg.l 72  aref 23  brf.l 49  symbol? 34  aset! 64  car 12  cons 32  tcall.l 84  - 56  brn.l 88  optargs 89  nop 46  closure 14  pop 4  eqv? 51  list 53  seta 15  seta.l 73  brnn 26  loadnil 65  loadc00 17  loadg 7  loada 8  dummy_nil 94  tcall 6)
 	    __init_globals #fn("6000n020w1422w3474w5476w7478w9:" #("/"
 								   *directory-separator*
 								   "\n"
@@ -79,7 +82,7 @@
 	    __start #fn("8000n1705040=B3D00=w14Ow24730T51@C00w14Dw24745047550426E61:" #(__init_globals
   *argv* *interactive* __script __rcscript repl #fn(exit)) __start)
 	    abs #fn("7000n10EL3500U:0:" #() abs) any
-	    #fn("8000n21B;3D0401<51;I:047001=62:" #(any) any) arg-counts #table(null? 1  atom? 1  eq? 2  boolean? 1  function? 1  builtin? 1  = 2  aref 2  vector? 1  cdr 1  symbol? 1  cadr 1  pair? 1  set-car! 2  compare 2  < 2  fixnum? 1  div0 2  car 1  set-cdr! 2  number? 1  equal? 2  cons 2  bound? 1  eqv? 2  aset! 3  not 1)
+	    #fn("8000n21B;3D0401<51;I:047001=62:" #(any) any) arg-counts #table(bound? 1  function? 1  symbol? 1  aset! 3  car 1  cons 2  cadr 1  < 2  vector? 1  boolean? 1  fixnum? 1  atom? 1  cdr 1  div0 2  equal? 2  eqv? 2  pair? 1  compare 2  null? 1  = 2  number? 1  not 1  set-cdr! 2  eq? 2  builtin? 1  set-car! 2  aref 2)
 	    argc-error #fn("<000n2702102211Kl37023@402465:" #(error "compile error: "
 							      " expects " " argument."
 							      " arguments.") argc-error)
@@ -356,12 +359,11 @@
 			     #fn("7000n1A50420061:" #(#fn(raise)))))
   #fn("6000n0Aw0:" #(*print-readably*)))) *print-readably*) princ)
 	    print #fn(":000|07021062:" #(for-each #fn(write)) print)
-	    print-exception #fn("=000n10B;3D040<20Q;3:04710r4523P072230T247505126554777805151@\x0a00B;3D040<29Q;3:04710r4523N0720T2:780512;544777505151@\xd300B;3@040<2<Q;36040=B3B0722=750512>53@\xac00B;38040<2?Q3B0722@514720=f2@\x8d00B;38040<2AQ3G07B75051514722C0T52@i07D051;3:04710r2523I0770<514722E5142F0T51@>0722G514770514727H61:" #(type-error
-  length= princ "type error: " ": expected " caddr ", got " print cadddr
-  bounds-error ": index " " out of bounds for " unbound-error "eval: variable "
-  " has no value" error "error: " load-error print-exception "in file " list?
-  ": " #fn("8000n120051;I5040R37071@4072061:" #(#fn(string?) princ print))
-  "*** Unhandled exception: " *linefeed*) print-exception)
+	    print-exception #fn("=000n10B;3D040<20Q;3:04710r3523I072230T24534757605151@\x0600B;3D040<27Q;3:04710r3523I072287605129534750T51@\xd400B;3D040<2:Q;3:04710r2523?0722;0T2<53@\xac00B;38040<2=Q3B0722>514720=f2@\x8d00B;38040<2?Q3G07@76051514722A0T52@i07B051;3:04710r2523I0750<514722C5142D0T51@>0722E514750514727F61:" #(type-error
+  length= princ "type error: expected " ", got " print caddr bounds-error "index "
+  " out of bounds for " unbound-error "eval: variable " " has no value" error
+  "error: " load-error print-exception "in file " list? ": " #fn("8000n120051;I5040R37071@4072061:" #(#fn(string?)
+  princ print)) "*** Unhandled exception: " *linefeed*) print-exception)
 	    print-stack-trace #fn("8000n120>DD62:" #(#fn(">000n220>?0421>?1422>7374Ar3523F075A76370r5@40r452@30A517778292:2;505252E63:" #(#fn("8000n320>2105182P61:" #(#fn("9000n120A5120F51C>02122230e361:24>25A5161:" #(#fn(function:code)
   #fn(raise) thrown-value ffound #fn(":000n1E70210515122>~:" #(1- #fn(length)
 							       #fn("9000n170A0G513A0930A0G92191063:D:" #(closure?))))
--- a/flisp.c
+++ b/flisp.c
@@ -33,7 +33,6 @@
 uint32_t SP = 0;
 static uint32_t N_STACK;
 static uint32_t curr_frame = 0;
-static value_t curr_func;
 
 value_t FL_NIL, FL_T, FL_F, FL_EOF, QUOTE;
 value_t NIL, LAMBDA, IF, TRYCATCH;
@@ -148,47 +147,16 @@
 	longjmp(thisctx->buf, 1);
 }
 
-static char *
-curr_func_name(void)
-{
-	if(iscbuiltin(curr_func))
-		return cvalue_cbuiltin_name(curr_func);
-	if(isbuiltin(curr_func))
-		return builtins[uintval(curr_func)].name;
-	if(isfunction(curr_func)){
-		function_t *fn = ptr(curr_func);
-		return fn->name == LAMBDA ? "λ" : symbol_name(fn->name);
-	}
-
-	return "???";
-}
-
-static value_t
-make_error_msg(char *format, va_list args)
-{
-	char msgbuf[512], *s;
-	const char *f;
-	int n;
-	if(curr_func != NIL){
-		f = curr_func_name();
-		n = snprintf(msgbuf, sizeof(msgbuf), "%s: ", f != nil ? f : "???");
-		curr_func = NIL;
-	}else{
-		n = 0;
-	}
-	s = msgbuf + n;
-	n = sizeof(msgbuf) - n;
-	vsnprintf(s, n, format, args);
-	return string_from_cstr(msgbuf);
-}
-
 _Noreturn void
 lerrorf(value_t e, char *format, ...)
 {
+	char msgbuf[256];
 	va_list args;
+
 	PUSH(e);
 	va_start(args, format);
-	value_t msg = make_error_msg(format, args);
+	vsnprintf(msgbuf, sizeof(msgbuf), format, args);
+	value_t msg = string_from_cstr(msgbuf);
 	va_end(args);
 
 	e = POP();
@@ -198,19 +166,19 @@
 _Noreturn void
 type_error(char *expected, value_t got)
 {
-	fl_raise(fl_listn(4, TypeError, symbol(curr_func_name()), symbol(expected), got));
+	fl_raise(fl_listn(3, TypeError, symbol(expected), got));
 }
 
 _Noreturn void
 bounds_error(value_t arr, value_t ind)
 {
-	fl_raise(fl_listn(4, BoundsError, symbol(curr_func_name()), arr, ind));
+	fl_raise(fl_listn(3, BoundsError, arr, ind));
 }
 
 _Noreturn void
 unbound_error(value_t sym)
 {
-	fl_raise(fl_listn(3, UnboundError, symbol(curr_func_name()), sym));
+	fl_raise(fl_listn(2, UnboundError, sym));
 }
 
 // safe cast operators --------------------------------------------------------
@@ -629,7 +597,6 @@
 	value_t f = Stack[SP-n-1];
 	uint32_t saveSP = SP;
 	value_t v;
-	curr_func = f;
 	if(iscbuiltin(f)){
 		v = ((builtin_t*)ptr(f))[3](&Stack[SP-n], n);
 	}else if(isfunction(f)){
@@ -979,8 +946,6 @@
 
 	op = *ip++;
 	while(1){
-		curr_func = builtin(op);
-
 		switch(op){
 		OP(OP_LOADA0)
 			PUSH(captured ? vector_elt(Stack[bp], 0) : Stack[bp]);
@@ -1024,7 +989,6 @@
 		do_call:
 			func = Stack[SP-n-1];
 			if(tag(func) == TAG_FUNCTION){
-				curr_func = func;
 				if(func > (N_BUILTINS<<3)){
 					if(tail){
 						curr_frame = Stack[curr_frame-4];
@@ -1037,7 +1001,6 @@
 					nargs = n;
 					goto apply_cl_top;
 				}else{
-					curr_func = func;
 					i = uintval(func);
 					if(isbuiltin(func)){
 						s = builtins[i].nargs;
@@ -1064,7 +1027,6 @@
 					}
 				}
 			}else if(iscbuiltin(func)){
-				curr_func = func;
 				s = SP;
 				v = (((builtin_t*)ptr(func))[3])(&Stack[SP-n], n);
 				SP = s-n;
@@ -2228,7 +2190,6 @@
 	PUSH(sys_image_iostream);
 	saveSP = SP;
 	FL_TRY{
-		curr_func = NIL;
 		while(1){
 			e = fl_read_sexpr(Stack[SP-1]);
 			if(ios_eof(value2c(ios_t*, Stack[SP-1])))
--- a/opcodes.h
+++ b/opcodes.h
@@ -99,38 +99,38 @@
 };
 
 static const Builtin builtins[] = {
-	[OP_NUMBERP] = {"number?", 1},
-	[OP_NUMEQ] = {"=", 2},
+	[OP_SETCAR] = {"set-car!", 2},
+	[OP_CDR] = {"cdr", 1},
 	[OP_BOOLEANP] = {"boolean?", 1},
-	[OP_IDIV] = {"div0", 2},
-	[OP_DIV] = {"/", -1},
-	[OP_PAIRP] = {"pair?", 1},
-	[OP_ATOMP] = {"atom?", 1},
-	[OP_SYMBOLP] = {"symbol?", 1},
+	[OP_FUNCTIONP] = {"function?", 1},
+	[OP_CADR] = {"cadr", 1},
+	[OP_SETCDR] = {"set-cdr!", 2},
+	[OP_EQ] = {"eq?", 2},
 	[OP_APPLY] = {"apply", -2},
-	[OP_BOUNDP] = {"bound?", 1},
-	[OP_EQV] = {"eqv?", 2},
-	[OP_NOT] = {"not", 1},
-	[OP_SUB] = {"-", -1},
 	[OP_NULLP] = {"null?", 1},
-	[OP_CAR] = {"car", 1},
-	[OP_VECTOR] = {"vector", ANYARGS},
 	[OP_ASET] = {"aset!", 3},
-	[OP_FUNCTIONP] = {"function?", 1},
-	[OP_EQ] = {"eq?", 2},
-	[OP_BUILTINP] = {"builtin?", 1},
+	[OP_ATOMP] = {"atom?", 1},
+	[OP_NOT] = {"not", 1},
 	[OP_LIST] = {"list", ANYARGS},
-	[OP_AREF] = {"aref", 2},
-	[OP_FIXNUMP] = {"fixnum?", 1},
-	[OP_VECTORP] = {"vector?", 1},
-	[OP_ADD] = {"+", ANYARGS},
 	[OP_CONS] = {"cons", 2},
-	[OP_SETCDR] = {"set-cdr!", 2},
-	[OP_COMPARE] = {"compare", 2},
-	[OP_SETCAR] = {"set-car!", 2},
+	[OP_NUMBERP] = {"number?", 1},
+	[OP_BOUNDP] = {"bound?", 1},
 	[OP_LT] = {"<", 2},
-	[OP_EQUAL] = {"equal?", 2},
+	[OP_VECTORP] = {"vector?", 1},
+	[OP_CAR] = {"car", 1},
+	[OP_EQV] = {"eqv?", 2},
+	[OP_IDIV] = {"div0", 2},
+	[OP_FIXNUMP] = {"fixnum?", 1},
+	[OP_NUMEQ] = {"=", 2},
+	[OP_SYMBOLP] = {"symbol?", 1},
+	[OP_BUILTINP] = {"builtin?", 1},
+	[OP_SUB] = {"-", -1},
+	[OP_COMPARE] = {"compare", 2},
+	[OP_PAIRP] = {"pair?", 1},
 	[OP_MUL] = {"*", ANYARGS},
-	[OP_CADR] = {"cadr", 1},
-	[OP_CDR] = {"cdr", 1},
+	[OP_AREF] = {"aref", 2},
+	[OP_ADD] = {"+", ANYARGS},
+	[OP_DIV] = {"/", -1},
+	[OP_VECTOR] = {"vector", ANYARGS},
+	[OP_EQUAL] = {"equal?", 2},
 };
--- a/system.lsp
+++ b/system.lsp
@@ -951,20 +951,20 @@
 (define (print-exception e)
   (cond ((and (pair? e)
               (eq? (car e) 'type-error)
-              (length= e 4))
-         (princ "type error: " (cadr e) ": expected " (caddr e) ", got ")
-         (print (cadddr e)))
+              (length= e 3))
+         (princ "type error: expected " (cadr e) ", got ")
+         (print (caddr e)))
 
         ((and (pair? e)
               (eq? (car e) 'bounds-error)
-              (length= e 4))
-         (princ (cadr e) ": index " (cadddr e) " out of bounds for ")
-         (print (caddr e)))
+              (length= e 3))
+         (princ "index " (caddr e) " out of bounds for ")
+         (print (cadr e)))
 
         ((and (pair? e)
               (eq? (car e) 'unbound-error)
-              (pair? (cdr e)))
-         (princ "eval: variable " (caddr e) " has no value"))
+              (length= e 2))
+         (princ "eval: variable " (cadr e) " has no value"))
 
         ((and (pair? e)
               (eq? (car e) 'error))