From e75e6bda47819e2be53615a2cc8f3d1d20741be2 Mon Sep 17 00:00:00 2001 From: Kaz Kylheku Date: Wed, 3 Jan 2018 03:17:33 -0800 Subject: car, cdr: fall back on lambda method. * lib.c (car, cdr): Don't fail if the struct object has no car or cdr method. Use it if it is available, otherwise try to fall back on the lambda method if that is available. --- lib.c | 28 ++++++++++++++++++++++++---- 1 file changed, 24 insertions(+), 4 deletions(-) (limited to 'lib.c') diff --git a/lib.c b/lib.c index 6bb5f809..c126cada 100644 --- a/lib.c +++ b/lib.c @@ -380,8 +380,18 @@ val car(val cons) return nil; return chr_str(cons, zero); case COBJ: - if (obj_struct_p(cons)) - return funcall1(slot(cons, car_s), cons); + if (obj_struct_p(cons)) { + { + val car_meth = maybe_slot(cons, car_s); + if (car_meth) + return funcall1(car_meth, cons); + } + { + val lambda_meth = maybe_slot(cons, lambda_s); + if (lambda_meth) + return funcall2(lambda_meth, cons, zero); + } + } default: type_mismatch(lit("~s is not a cons"), cons, nao); } @@ -411,8 +421,18 @@ val cdr(val cons) return nil; return sub(cons, one, t); case COBJ: - if (obj_struct_p(cons)) - return funcall1(slot(cons, cdr_s), cons); + if (obj_struct_p(cons)) { + { + val cdr_meth = maybe_slot(cons, cdr_s); + if (cdr_meth) + return funcall1(cdr_meth, cons); + } + { + val lambda_meth = maybe_slot(cons, lambda_s); + if (lambda_meth) + return funcall2(lambda_meth, cons, rcons(one, t)); + } + } default: type_mismatch(lit("~s is not a cons"), cons, nao); } -- cgit v1.2.3