(use srfi-1 miscmacros) (define (progressbar val max width) (let* ((filled "▮") (blank "▯") (scale (/ val max)) (filled-bars (inexact->exact (round (* scale width))))) (repeat filled-bars (display filled)) (repeat (- width filled-bars) (display blank)) (printf " ~a%~%" (inexact->exact (round (* 100 scale)))))) (let* ((nargs (length (argv))) (prog (car (argv))) (args (cdr (argv))) (conv (map string->number args))) (when (or (any not conv) (< (length (argv)) 3)) (printf "~a - print a progressbar~%~a\tVALUE MAXVAL [WIDTH]~%" (car (argv)) (car (argv))) (exit 1)) (progressbar (car conv) (cadr conv) (if (= nargs 4) (caddr conv) 50))) ;; → ./pb 300 365 20 ;; ▮▮▮▮▮▮▮▮▮▮▮▮▮▮▮▮▯▯▯▯ 82%