[slime-devel] Re: patch to destructure-case

Matthew D Swank akopa at charter.net
Fri Jun 30 23:50:31 EDT 2006


Matthew D Swank wrote:
> Matthew D Swank wrote:
>> Would it be possible to have destructure-case match against arbitrary,
>> non-nil atoms (patch attached)?
>>
> Forget it. That patch obviously won't work as is, and I can't seem to
> find the patched version of slime I was using at the moment.
> 

This one should work.

Matt

-- 
"You do not really understand something unless you can explain it to
your grandmother." — Albert Einstein.
-------------- next part --------------
--- slime/swank.lisp.orig	2006-06-18 13:21:54.000000000 -0500
+++ slime/swank.lisp	2006-06-30 22:07:03.000000000 -0500
@@ -293,19 +293,22 @@
 A cross between `case' and `destructuring-bind'.
 The pattern syntax is:
   ((HEAD . ARGS) . BODY)
+or:
+  (ATOM . BODY)
 The list of patterns is searched for a HEAD `eq' to the car of
-VALUE. If one is found, the BODY is executed with ARGS bound to the
-corresponding values in the CDR of VALUE."
+VALUE (or ATOM `eq' to VALUE as the case may be). If one is 
+found, the BODY is executed with ARGS bound to the corresponding 
+values in the CDR of VALUE."
   (let ((operator (gensym "op-"))
 	(operands (gensym "rand-"))
 	(tmp (gensym "tmp-")))
     `(let* ((,tmp ,value)
-	    (,operator (car ,tmp))
-	    (,operands (cdr ,tmp)))
+	    (,operator (or (and (listp ,tmp) (car ,tmp)) ,tmp))
+	    (,operands (or (and (listp ,tmp) (cdr ,tmp)))))
        (case ,operator
          ,@(loop for (pattern . body) in patterns collect 
-                   (if (eq pattern t)
-                       `(t , at body)
+                   (if (and pattern (atom pattern))
+                       `(,pattern , at body)
                        (destructuring-bind (op &rest rands) pattern
                          `(,op (destructuring-bind ,rands ,operands 
                                  , at body)))))


More information about the slime-devel mailing list