Work on documenting CSV module and extending duck to support racket-kwargs.

This commit is contained in:
Dominik Pantůček 2023-07-04 22:31:53 +02:00
parent a5afb25dd7
commit 4d81684cff
6 changed files with 53 additions and 16 deletions

View file

@ -34,3 +34,20 @@ Converts given seconds to ISO date string YYYY-MM-DD. Defaults to ```(current-se
(today/iso) (today/iso)
Returns today as ISO date string YYYY-MM-DD. Returns today as ISO date string YYYY-MM-DD.
## util-csv [module]
(import util-csv)
This module provides a very simple, incomplete and incorrect but fast
CSV loader.
### (make-csv-line-parser separator string-delimiter) [procedure]
((make-csv-line-parser separator string-delimiter) line)
Curried version of fast CSV line parser with given separator and string delimiter.
* ```separator``` - separator character
* ```string-delimiger``` - string quotation character
* ```line``` - line to parse

View file

@ -56,12 +56,13 @@ HACKERBASE-OBJS=hackerbase.o testing.o listing.o cal-month.o \
sgr-list.o sgr-block.o table-processor.o table-border.o \ sgr-list.o sgr-block.o table-processor.o table-border.o \
table-style.o sgr-state.o util-utf8.o sgr-cell.o \ table-style.o sgr-state.o util-utf8.o sgr-cell.o \
template-list-expander.o box-drawing.o util-list.o \ template-list-expander.o box-drawing.o util-list.o \
export-web-static.o util-dir.o racket-kwargs.o dokuwiki.o export-web-static.o util-dir.o dokuwiki.o
GENDOC-SOURCES=gendoc.scm duck-extract.import.scm \ GENDOC-SOURCES=gendoc.scm duck-extract.import.scm \
util-time.import.scm util-time.import.scm util-csv.import.scm
GENDOC-OBJS=gendoc.o duck-extract.o util-time.o GENDOC-OBJS=gendoc.o duck-extract.o util-time.o util-csv.o util-io.o \
progress.o testing.o
.PHONY: imports .PHONY: imports
imports: $(HACKERBASE-DEPS) imports: $(HACKERBASE-DEPS)
@ -222,8 +223,8 @@ MBASE-DIR-SOURCES=mbase-dir.scm testing.import.scm \
mbase-dir.o: mbase-dir.import.scm mbase-dir.o: mbase-dir.import.scm
mbase-dir.import.scm: $(MBASE-DIR-SOURCES) mbase-dir.import.scm: $(MBASE-DIR-SOURCES)
UTIL-CSV-SOURCES=util-csv.scm testing.import.scm \ UTIL-CSV-SOURCES=util-csv.scm testing.import.scm progress.import.scm \
progress.import.scm util-io.import.scm util-io.import.scm duck.import.scm racket-kwargs.import.scm
util-csv.o: util-csv.import.scm util-csv.o: util-csv.import.scm
util-csv.import.scm: $(UTIL-CSV-SOURCES) util-csv.import.scm: $(UTIL-CSV-SOURCES)

View file

@ -40,10 +40,20 @@
(define var val)) (define var val))
((_ (define/doc var doc val)) ((_ (define/doc var doc val))
(define var val)) (define var val))
((_ (define/doc var doc arg (make-parameter val))) ((_ (define/doc var doc arg (make-parameter val)))
(define var val)) (define var val))
((_ (define* var val))
(define* var val))
((_ (define*/doc var doc val))
(define* var val))
((_ (define (proc . args) expr ...)) ((_ (define (proc . args) expr ...))
(define (proc . args) expr ...)) (define (proc . args) expr ...))
((_ (define/doc (proc . args) doc expr ...))
(define (proc . args) expr ...))
((_ expr) ((_ expr)
expr))) expr)))

View file

@ -20,4 +20,5 @@
(gen-duck "doc/d-utils.md" (gen-duck "doc/d-utils.md"
"Utility modules" "Utility modules"
"These are various utility modules for other HackerBase libraries." "These are various utility modules for other HackerBase libraries."
util-time) util-time
util-csv)

View file

@ -26,8 +26,6 @@
;; CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ;; CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
;; ;;
(declare (unit racket-kwargs))
(module (module
racket-kwargs racket-kwargs
( (

View file

@ -25,8 +25,12 @@
(declare (unit util-csv)) (declare (unit util-csv))
(module (import duck)
(module*
util-csv util-csv
#:doc ("This module provides a very simple, incomplete and incorrect but fast
CSV loader.")
( (
make-csv-line-parser make-csv-line-parser
csv-parse csv-parse
@ -41,11 +45,17 @@
(chicken condition) (chicken condition)
testing testing
progress progress
util-io) util-io
racket-kwargs)
;; Curry version of line parser with configurable cell separator and ;; Curry version of line parser with configurable cell separator and
;; string delimiter. Returns a list of lists of strings. ;; string delimiter. Returns a list of lists of strings.
(define ((make-csv-line-parser separator string-delimiter) line) (define/doc ((make-csv-line-parser separator string-delimiter) line)
("Curried version of fast CSV line parser with given separator and string delimiter.
* ```separator``` - separator character
* ```string-delimiger``` - string quotation character
* ```line``` - line to parse")
(let loop ((tokens (string->list line)) (let loop ((tokens (string->list line))
(res '()) (res '())
(state 1)) (state 1))
@ -86,10 +96,10 @@
(cons (cons token (car res)) (cdr res)) (cons (cons token (car res)) (cdr res))
2)))))))) ; Continue inside quoted data 2)))))))) ; Continue inside quoted data
;; Parses given CSV lines list ;; Parses given CSV lines list
(define (csv-parse-lines lines . args) (define* (csv-parse-lines lines
(let* ((separator (get-keyword #:separator args (lambda () #\;))) #:separator (separator #\;)
(string-delimiter (get-keyword #:string-delimiter args (lambda () #\"))) #:string-delimiter (string-delimiter #\"))
(csv-parse-line (make-csv-line-parser separator string-delimiter)) (let* ((csv-parse-line (make-csv-line-parser separator string-delimiter))
(total (max (sub1 (length lines)) 1))) (total (max (sub1 (length lines)) 1)))
(let loop ((lines lines) (let loop ((lines lines)
(idx 0) (idx 0)