;;;; levenshtein-print.scm -*- Scheme -*- ;;;; Kon Lovett, Mar '20 ;;;; Kon Lovett, Apr '12 ;;;; Kon Lovett, Sep '05 ;;Issues ;; ;; - Assues operator name never > 15 chars & cost never > 2. (module levenshtein-print (;export print-levenshtein-matrix) (import scheme) (import (chicken base)) (import (chicken type)) (import (only (chicken string) ->string)) (import (only (srfi 1) first second)) (import (only (srfi 13) string-pad)) (import (only (srfi 63) array? array-rank array-dimensions array-ref)) (import (only levenshtein-operators levenshtein-operator-key)) (import (only type-errors error-argument-type)) ;;; ;; Types (define-type array (struct array)) (: print-levenshtein-matrix (array -> void)) (: print-levenshtein-matrix-slice (array fixnum fixnum fixnum fixnum -> void)) (: print-levenshtein-matrix-element ((or string (pair string string)) -> void)) ;; SRFI-63 (from srfi-63.scm example) (define (nonstrict-array? obj) (or (string? obj) (vector? obj))) (define (strict-array? obj) (and (array? obj) (not (nonstrict-array? obj)))) ;; String (define (padded-string x n) (string-pad (->string x) n)) ;;; (define (print-levenshtein-matrix pm) (if (and (strict-array? pm) (= 2 (array-rank pm))) (let ((dims (array-dimensions pm))) (print-levenshtein-matrix-slice pm 0 (first dims) 0 (second dims)) ) (error-argument-type 'print-levenshtein-matrix pm "rank 2 array" "path-matrix") ) ) ;; (define (print-levenshtein-matrix-slice pm i0 n j0 m) (do ((i i0 (add1 i))) ((>= i n)) (do ((j j0 (add1 j))) ((>= j m) (newline)) (print-levenshtein-matrix-element (array-ref pm i j)) (display #\space) ) ) ) (define (print-levenshtein-matrix-element elm) (if (pair? elm) (print* #\( (padded-string (car elm) 2) #\space (padded-string (levenshtein-operator-key (cdr elm)) 15) #\)) (display (padded-string elm 15)) ) ) #| ;KRL's array-lib (use array-lib-hof format-modular levenshtein-vector) (define (print-levenshtein-matrix pm) (array-for-each-index (lambda (i j) (when (zero? j) (format #t "~%")) (let ((elm (array-ref pm i j))) (if elm (format #t "(~2A ~10A) " (car elm) (levenshtein-operator-key (cdr elm))) (format #t "~15A " elm)))) pm) (format #t "~%") ) |# ) ;module levenshtein-print