;;;; slib-charplot.scm ;;;; Kon Lovett, Mar '20 (module slib-charplot (;export plot-dimensions plot-left-margin xborder-char yborder-char xaxis-char yaxis-char xtick-char bar-char curves-chars histograph plot) (import scheme) (import (chicken module)) (import (only (chicken base) include let-values error identity warning make-parameter)) (import (chicken type)) (import (only (chicken port) terminal-size)) (import (only (srfi 1) last-pair)) (import (srfi 63)) ;FIXME chicken-install has the feature but after that ... (cond-expand (utf8 (import utf8) (warning "Using utf8 Extension")) (else)) ;; Types (define-type array (struct array)) ;SRFI 63 (define-type plotdims (list fixnum fixnum)) ;(H W) (define-type plotdata (or array vector list)) ;Nd elms (define-type histdata (or (vector number) (list number))) ;1d elms (: plot-dimensions (#!optional (or boolean plotdims) -> (or boolean plotdims))) (: plot-left-margin (#!optional (or boolean fixnum) -> fixnum)) (: xborder-char (#!optional (or boolean char) -> char)) (: yborder-char (#!optional (or boolean char) -> char)) (: xaxis-char (#!optional (or boolean char) -> char)) (: yaxis-char (#!optional (or boolean char) -> char)) (: xtick-char (#!optional (or boolean char) -> char)) (: bar-char (#!optional (or boolean char) -> char)) (: curves-chars (#!optional (or boolean string) -> string)) (: plot (or (plotdata string string #!optional boolean -> void) ((number -> float) number number #!optional fixnum -> void))) (: histograph (histdata string -> void)) ;; (include "slib-compat") (include "arraymap") (include "charplot.incl") ;; Parameters (replacements for SLIB graph part globals) (define plot-dimensions (make-parameter charplot:dimensions (lambda (x) (cond ((not x) x) ((and (list? x) (<= (length x) 2)) x) (else (warning 'plot-dimensions "not a list (H W)") (plot-dimensions) ) ) ) ) ) (define plot-left-margin (make-parameter charplot:left-margin (lambda (x) (cond ((not x) 2) ((and (exact? x) (integer? x) (<= 2 x)) x) (else (warning 'plot-left-margin "not an exact-integer of at least 2") (plot-left-margin) ) ) ) ) ) (define-syntax char-warning-predicate (syntax-rules () ((char-warning-predicate ?loc ?def) (lambda (x) (cond ((not x) ?def) ((char? x) x) (else (warning '?loc "not a character") (?loc) ) ) ) ) ) ) (define xborder-char (make-parameter #f (char-warning-predicate xborder-char char:xborder))) (define yborder-char (make-parameter #f (char-warning-predicate yborder-char char:yborder))) (define xaxis-char (make-parameter #f (char-warning-predicate xaxis-char char:xaxis))) (define yaxis-char (make-parameter #f (char-warning-predicate yaxis-char char:yaxis))) (define xtick-char (make-parameter #f (char-warning-predicate xtick-char char:xtick))) (define bar-char (make-parameter #f (char-warning-predicate bar-char char:bar))) (define curves-chars (make-parameter #f (lambda (x) (cond ((not x) char:curves) ((and (string? x) (<= 1 (string-length x))) x) (else (warning 'curves-chars "not a string of at least length 1") (curves-chars) ) ) ) ) ) ) ;module slib-charplot