ChessLisp design notes: old style basic list accessors
A Lisp old style basic list accessor is a function that takes a single operand (a list) and returns the indicated component of the list. There are thirty of these defined in Common Lisp, and ChessLisp implements the whole set for compatibility purposes.
The car (contents of address register) and cdr (contents of data register) functions are from the first version of Lisp (i.e., Lisp 1.0 or Year Zero Lisp or Lisp 1958). Better are the more recent, Common Lisp equivalents first and rest.
Likewise, cadr == second, caddr = third, cadddr = fourth.
ChessLisp observes the Common Lisp semantics of the basement cases (car nil) == nil and (cdr nil) == nil.
Old style basic list accessors coded and tested (this is actual dispatch source):
Code: Select all
/* caaaar */ case sysfuncCaaaar: EvalSysFuncCaaaar(); break;
/* caaadr */ case sysfuncCaaadr: EvalSysFuncCaaadr(); break;
/* caaar */ case sysfuncCaaar: EvalSysFuncCaaar(); break;
/* caadar */ case sysfuncCaadar: EvalSysFuncCaadar(); break;
/* caaddr */ case sysfuncCaaddr: EvalSysFuncCaaddr(); break;
/* caadr */ case sysfuncCaadr: EvalSysFuncCaadr(); break;
/* caar */ case sysfuncCaar: EvalSysFuncCaar(); break;
/* cadaar */ case sysfuncCadaar: EvalSysFuncCadaar(); break;
/* cadadr */ case sysfuncCadadr: EvalSysFuncCadadr(); break;
/* cadar */ case sysfuncCadar: EvalSysFuncCadar(); break;
/* caddar */ case sysfuncCaddar: EvalSysFuncCaddar(); break;
/* cadddr */ case sysfuncCadddr: EvalSysFuncCadddr(); break;
/* caddr */ case sysfuncCaddr: EvalSysFuncCaddr(); break;
/* cadr */ case sysfuncCadr: EvalSysFuncCadr(); break;
/* car */ case sysfuncCar: EvalSysFuncCar(); break;
/* cdaaar */ case sysfuncCdaaar: EvalSysFuncCdaaar(); break;
/* cdaadr */ case sysfuncCdaadr: EvalSysFuncCdaadr(); break;
/* cdaar */ case sysfuncCdaar: EvalSysFuncCdaar(); break;
/* cdadar */ case sysfuncCdadar: EvalSysFuncCdadar(); break;
/* cdaddr */ case sysfuncCdaddr: EvalSysFuncCdaddr(); break;
/* cdadr */ case sysfuncCdadr: EvalSysFuncCdadr(); break;
/* cdar */ case sysfuncCdar: EvalSysFuncCdar(); break;
/* cddaar */ case sysfuncCddaar: EvalSysFuncCddaar(); break;
/* cddadr */ case sysfuncCddadr: EvalSysFuncCddadr(); break;
/* cddar */ case sysfuncCddar: EvalSysFuncCddar(); break;
/* cdddar */ case sysfuncCdddar: EvalSysFuncCdddar(); break;
/* cddddr */ case sysfuncCddddr: EvalSysFuncCddddr(); break;
/* cdddr */ case sysfuncCdddr: EvalSysFuncCdddr(); break;
/* cddr */ case sysfuncCddr: EvalSysFuncCddr(); break;
/* cdr */ case sysfuncCdr: EvalSysFuncCdr(); break;
Note: Not all run time error checking has been implemented -- yet.