(,kind ,scrutinee
,@(mapcar (lambda (clause)
(destructuring-bind
- (cases (&optional var) &rest forms)
+ (cases (&optional varx vary) &rest forms)
clause
`(,cases
- ,@(if var
- (list `(let ((,var ,argument)) ,@forms))
+ ,@(if varx
+ (list `(let ((,(or vary varx) ,argument)
+ ,@(and vary
+ `((,varx ,scrutinee))))
+ ,@forms))
forms))))
clauses)))))
(defmacro case2 (vform &body clauses)
"VFORM is a form which evaluates to two values, SCRUTINEE and ARGUMENT.
- The CLAUSES have the form (CASES ([VAR]) FORMS...), where a standard
- `case' clause has the form (CASES FORMS...). The `case2' form evaluates
- the VFORM, and compares the SCRUTINEE to the various CASES, in order, just
- like `case'. If there is a match, then the corresponding FORMs are
- evaluated with VAR (if specified) bound to the value of ARGUMENT."
+ The CLAUSES have the form (CASES ([[SCRUVAR] ARGVAR]) FORMS...), where a
+ standard `case' clause has the form (CASES FORMS...). The `case2' form
+ evaluates the VFORM, and compares the SCRUTINEE to the various CASES, in
+ order, just like `case'. If there is a match, then the corresponding
+ FORMs are evaluated with ARGVAR bound to the ARGUMENT and SCRUVAR bound to
+ the SCRUTINEE (where specified). Note the bizarre defaulting behaviour:
+ ARGVAR is less optional than SCRUVAR."
(do-case2-like 'case vform clauses))
(defmacro ecase2 (vform &body clauses)