;;;; 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 (chicken module) (only (chicken base) include include-relative let-values let-optionals error identity warning make-parameter) (chicken type) (only (chicken platform) features) (only (chicken keyword) string->keyword) (only (srfi 1) last-pair) (srfi 63) slib-arraymap) ;FIXME chicken-install has the feature but after that ... (cond-expand (utf8 (import utf8) (warning "Using utf8 Extension")) (else)) ;; Types (define-type array-strict (struct array)) ;SRFI 63 (define-type array (or string vector array-strict)) (define-type plotdims (list fixnum fixnum)) ;(H W) (define-type plotdata (or vector list array-strict)) ;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)) ;only works due to slib plot . args (?) (: plot (or (plotdata #!optional string string boolean -> void) ((number -> float) #!optional number number fixnum -> void))) (: histograph (histdata #!optional string -> void)) ;; (include-relative "slib-compat") (include-relative "charplot") ;; ;optional axis labels (define slib:plot plot) (set! plot (lambda (data . args) (if (procedure? data) (let-optionals args ((lo 0) (hi 1) (npts 64)) (slib:plot data lo hi npts)) (let-optionals args ((xaxis "") (yaxis "") (histogram? #f)) (slib:plot data xaxis yaxis histogram?))))) ;optional label (define slib:histograph histograph) (set! histograph (lambda (data . args) (let-optionals args ((label "")) (slib:histograph data label)))) ;; 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