From a5ab7e91e735d12cada1eb1df8d0f5c4bff0a2d1 Mon Sep 17 00:00:00 2001 From: Matthias Andreas Benkard Date: Wed, 30 Jul 2008 10:38:12 +0200 Subject: Fix handling of &KEY arguments. --- destructuring-bind.lisp | 23 ++++++++++++++++++++--- 1 file changed, 20 insertions(+), 3 deletions(-) (limited to 'destructuring-bind.lisp') diff --git a/destructuring-bind.lisp b/destructuring-bind.lisp index 8767630..bb44424 100644 --- a/destructuring-bind.lisp +++ b/destructuring-bind.lisp @@ -13,6 +13,19 @@ (%defun* %cdr (list) (sys::cdr list)) +(%defun* %cadr (list) + (sys::car (sys::cdr list))) + +(%defun* %cddr (list) + (sys::cdr (sys::cdr list))) + +(%defun* %getf (list indicator default) + (if (sys::null list) + default + (if (eq indicator (%car list)) + (%cadr list) + (%getf (%cddr list) indicator default)))) + (setq lambda-list-keywords '(&allow-other-keys &aux &body &environment &key &optional &rest &whole)) @@ -96,10 +109,14 @@ (caar head) (intern (symbol-name var) (find-package '#:keyword))))) `(let* ((,sym ,expression) - (,value-sym (getf ,sym ,keyword-name ',missing)) + (,value-sym (%getf ,sym ,keyword-name ',missing)) ,@(cond ((atom head) - `((,var ,value-sym))) - ((null (cdr head)) + `((,var (if (eq ,value-sym ',missing) + nil + ,value-sym)))) + ((null (if (eq ,value-sym ',missing) + nil + ,value-sym)) `((,var ,value-sym))) ((null (cddr head)) `((,var (if (eq ,value-sym ',missing) -- cgit v1.2.3