[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

historical question about CASE



    Date: Fri, 5 Jun 1987  16:11 EDT
    From: SOLEY@xx.lcs.mit.edu

	Date: Friday, 5 June 1987  14:41-EDT
	From: Barry Margolin <barmar at Think.COM>
	To:   Sandra J Loosemore <sandra%orion at cs.utah.edu>

	    Date: Fri, 5 Jun 87 11:19:20 MDT
	    From: sandra%orion@cs.utah.edu (Sandra J Loosemore)

	    While porting some code between CL implementations, I got bit . . .
	    Does anyone remember why it was decided to treat NIL as a list
	    instead of a symbol in this context?

	I don't remember specifically, but I would guess that it is for the
	benefit of macros that take a lists of things and turn them into case
	clauses.  For example:

	(defmacro do-something (thing &key allow-list ignore-list complain-list)
	  `(case ,thing
	     (,allow-list (frob-thing ,thing))
	     (,ignore-list nil)
	     (,complain-list (error "I won't frob ~S!" ,thing))))

    Silly Programmer, hacks are for kids.  That's no reason.

    (defmacro do-something (thing &key allow-list ignore-list complain-list)
      (append `(case ,thing)
	      (if allow-list `((,allow-list (frob-thing ,thing))))

	      .. etc ..
      ))

	    -- Richard

Why APPEND?  What's wrong with this:

(defmacro do-something (thing &key allow-list ignore-list complain-list)
  `(case ,thing
     ,@(when allow-list `((,allow-list (frob-thing ,thing))))
     ,@(when ignore-list `((,ignore-list nil)))
     ,@(when complain-list `((,complain-list (error "I won't frob ~S!" ,thing))))))

I use the idiom ",@(when foo `(...baz...))" a LOT.

But indeed, perhaps () as a case item should not have been made
to mean an empty list.  But it's probably too late now.
--Guy