(defun parse-c-integer (string &key (start 0) (end nil)) (match-case (string :start start :end end) ("0[0-7]*" (parse-integer $$ :radix 8)) ("[0-9]+" (parse-integer $$ :radix 10)) ("0[xX]([0-9A-Fa-f]+)" ;; note the submtach addressing $1 (parse-integer $1 :radix 16)) (otherwise (error "Funny integer: ~S" (subseq string start end))))) ;; Code you get: #+NIL (LET ((STRING.537872 STRING)) (MULTIPLE-VALUE-BIND (CAT S.537868 E.537870 S.537869 E.537871) ((LAMBDA (BUFFER.1 &KEY ((:START START) 0) ((:END END) NIL)) (CHECK-TYPE BUFFER.1 SIMPLE-STRING) (LOCALLY (DECLARE (TYPE SIMPLE-STRING BUFFER.1)) (LET ((LENGTH.2 (LENGTH BUFFER.1))) (DECLARE (TYPE (INTEGER 0 72057594037927936) LENGTH.2)) (SETQ END (OR END LENGTH.2)) (CHECK-TYPE START (INTEGER 0 72057594037927936)) (CHECK-TYPE END (INTEGER 0 72057594037927936)) (ASSERT (<= 0 START END LENGTH.2))) (LET ((BUFFER.1 BUFFER.1) (P START) (END END) (C.3 0)) (DECLARE (TYPE SIMPLE-STRING BUFFER.1) (TYPE (INTEGER 0 72057594037927936) P END START) (TYPE (INTEGER -2 (1114112)) C.3) (IGNORABLE C.3) (IGNORABLE BUFFER.1 P END) (OPTIMIZE (SPEED 3) (SAFETY 0))) (PROG ((WON.0 NIL) (R4 -1) (R-1 -1) (R0 -1) (R1 -1) (R2 -1) (R3 -1) (R8 -1)) (DECLARE (IGNORABLE WON.0 R4 R-1 R0 R1 R2 R3 R8) (TYPE (INTEGER -1 72057594037927936) R4 R-1 R0 R1 R2 R3 R8)) START (GO Q4) SCAN-LOOP (RETURN (VALUES)) Q3 (GO Q1) Q4 (WHEN (= P END) (GO Q1)) (SETQ C.3 (CHAR-CODE (SCHAR BUFFER.1 P))) (COND ((= C.3 48) (PSETQ R8 P) (SETQ P (THE (INTEGER 0 72057594037927936) (+ P 1))) (GO Q7)) ((<= 48 C.3 57) (PSETQ R8 P) (SETQ P (THE (INTEGER 0 72057594037927936) (+ P 1))) (GO Q6))) (GO Q1) Q5 (GO Q1) Q6 (WHEN (= P END) (PROGN (PSETQ R3 -1 R2 -1 R1 P R0 R8 R-1 1) (GO Q2))) (SETQ C.3 (CHAR-CODE (SCHAR BUFFER.1 P))) (WHEN (<= 48 C.3 57) (SETQ P (THE (INTEGER 0 72057594037927936) (+ P 1))) (GO Q6)) (GO Q1) Q7 (WHEN (= P END) (PROGN (PSETQ R3 -1 R2 -1 R1 P R0 (THE (INTEGER 0 72057594037927936) (- P 1)) R-1 0) (GO Q2))) (SETQ C.3 (CHAR-CODE (SCHAR BUFFER.1 P))) (COND ((OR (= C.3 88) (= C.3 120)) (SETQ P (THE (INTEGER 0 72057594037927936) (+ P 1))) (GO Q9)) ((OR (<= 48 C.3 55) (= C.3 88) (= C.3 120)) (SETQ P (THE (INTEGER 0 72057594037927936) (+ P 1))) (GO Q8)) ((OR (<= 48 C.3 57) (= C.3 88) (= C.3 120)) (SETQ P (THE (INTEGER 0 72057594037927936) (+ P 1))) (GO Q6))) (GO Q1) Q8 (WHEN (= P END) (PROGN (PSETQ R3 -1 R2 -1 R1 P R0 R8 R-1 0) (GO Q2))) (SETQ C.3 (CHAR-CODE (SCHAR BUFFER.1 P))) (COND ((<= 48 C.3 55) (SETQ P (THE (INTEGER 0 72057594037927936) (+ P 1))) (GO Q8)) ((<= 48 C.3 57) (SETQ P (THE (INTEGER 0 72057594037927936) (+ P 1))) (GO Q6))) (GO Q1) Q9 (WHEN (= P END) (GO Q1)) (SETQ C.3 (CHAR-CODE (SCHAR BUFFER.1 P))) (WHEN (OR (<= 48 C.3 57) (<= 65 C.3 70) (<= 97 C.3 102)) (PSETQ R4 P) (SETQ P (THE (INTEGER 0 72057594037927936) (+ P 1))) (GO Q10)) (GO Q1) Q10 (WHEN (= P END) (PROGN (PSETQ R3 P R2 R4 R1 P R0 R8 R-1 2) (GO Q2))) (SETQ C.3 (CHAR-CODE (SCHAR BUFFER.1 P))) (WHEN (OR (<= 48 C.3 57) (<= 65 C.3 70) (<= 97 C.3 102)) (SETQ P (THE (INTEGER 0 72057594037927936) (+ P 1))) (GO Q10)) (GO Q1) Q1 (GO SCAN-LOOP) Q2 (RETURN (VALUES (LET ((G4 R-1)) (IF (EQL G4 -1) NIL G4)) (LET ((G4 R0)) (IF (EQL G4 -1) NIL G4)) (LET ((G4 R1)) (IF (EQL G4 -1) NIL G4)) (LET ((G4 R2)) (IF (EQL G4 -1) NIL G4)) (LET ((G4 R3)) (IF (EQL G4 -1) NIL G4)))))))) STRING.537872 :START START :END END) (DECLARE (IGNORABLE S.537868 E.537870 S.537869 E.537871)) (WITH-SUBMATCH-MACROS-2 (STRING.537872) ((0 T S.537868 E.537870) (1 S.537869 S.537869 E.537871)) (CASE CAT ((0) (PARSE-INTEGER $$ :RADIX 8)) ((1) (PARSE-INTEGER $$ :RADIX 10)) ((2) (PARSE-INTEGER $1 :RADIX 16)) (OTHERWISE (ERROR "Funny integer: ~S" (SUBSEQ STRING START END)))))))