追記
正規表現とformatを使えばこれで十分なのか
(define (string-succ s) (rxmatch-cond [(#/^\d+$/ s) (n) (number->string (+ 1 (string->number n)))] [(#/^(\D*)(\D)$/ s) (#f ps last) (let1 chint (char->integer (string-ref last 0)) (string-append ps (string (integer->char (+ 1 chint)))))] [(#/^(\D+)(\d+)$/ s) (#f ps n) (let* ((area-size-chars (string->list (number->string (string-length n)))) (cmd (apply string `(#\~ ,@area-size-chars #\, #\, #\, #\' #\0 #\@ #\a))) (n+ (format #f cmd (+ 1 (string->number n))))) (if (= (string-length n+) (string-length n)) (string-append ps n+) (string-append (string-succ ps) (format #f cmd 0))))]))