追記

正規表現と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))))]))