(define-syntax CaseMettaHelper (syntax-rules (else) ((_ else bi) (list else bi)) ((_ ai bi) (list (list ai) bi)))) (define-syntax CaseMettaClean (syntax-rules (else) ((_ var ((a1 else))) (case var (else b1))) ((_ var ((a1 b1))) (case var ((a1) b1))) ((_ var ((ai bi) ...)) (list var (CaseMettaHelper ai bi) ...)))) ;^^^^ ;expected would have been to be able to use directly ;case instead of list here, but case is so greedy that ;CaseMettaHelper won't be evaluated before it complains about it. (define-syntax CaseMetta (syntax-rules (else) ((_ var cases) (eval (let ((x (CaseMettaClean var cases))) (append (list 'case) x)))))) ;forces to have the CaseMettaClean evaluated before filling in "case". (display (CaseMetta 3 ((1 2) (3 4)))) ;4