関数の引数に型を追加したら、面白いと思うんですが、
こういうのを総称型っていうのかな。

(define (+ (l <number>) (r <number>)) (prim:+ l r))
(define (+ (l <number>) r) (+ l (cast <number> r)))
(define (+ (l <string>) (r <string>)) (prim:string-append l r))
(define (+ (l <string>) r) (+ l (cast <string> r)))
(define (+ l . args) (fold-left + l args))

(+ 0 "123" "456") =>579
(+ "0" 123 456) =>"0123456"