#lang racket (provide (contract-out [string-fill (->* (string? char? (and/c positive? integer?)) (#:direction symbol?) string?)] )) (define (string-fill str char len #:direction [direction 'left]) (let* ([str-len (string-length str)] [distance (- len str-len)]) (if (> distance 0) (with-output-to-string (lambda () (when (eq? direction 'right) (printf str)) (let ([count 0]) (letrec ([recur (lambda () (set! count (add1 count)) (when (<= count distance) (printf "~a" char) (recur)))]) (recur))) (when (eq? direction 'left) (printf str)))) str)))