X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~mdw/git/lisp/blobdiff_plain/0ff9df03bb54ba792cefa551face51748ae34259..b3bc37457df55c92cabc8aeeb42bc67d3fb8af12:/mdw-base.lisp diff --git a/mdw-base.lisp b/mdw-base.lisp index cde1d7a..6b235f5 100644 --- a/mdw-base.lisp +++ b/mdw-base.lisp @@ -179,21 +179,26 @@ (compile-time-defun do-case2-like (kind vform clauses) (,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)