Initial import of schemify tree.
This commit is contained in:
commit
ae66820e49
1 changed files with 83 additions and 0 deletions
83
tools/schemify-tree.scm
Normal file
83
tools/schemify-tree.scm
Normal file
|
@ -0,0 +1,83 @@
|
|||
(import (chicken process-context)
|
||||
srfi-4
|
||||
(chicken file)
|
||||
(chicken pathname)
|
||||
(chicken format))
|
||||
|
||||
(define (get-argv)
|
||||
(let* ((args (argv))
|
||||
(rargs (member "--" args)))
|
||||
(if rargs
|
||||
(cdr rargs)
|
||||
(if (equal? (car args) "csi")
|
||||
'()
|
||||
(cdr args)))))
|
||||
|
||||
(define args (get-argv))
|
||||
(when (not (eq? (length args) 1))
|
||||
(display "usage: schemify-tree dir")
|
||||
(newline)
|
||||
(exit 1))
|
||||
|
||||
(define dir (car args))
|
||||
(define modname
|
||||
(if (null? (cdr args))
|
||||
'frontend-data
|
||||
(string->symbol (cadr args))))
|
||||
(define lookupname
|
||||
(if (or (null? (cdr args))
|
||||
(null? (cddr args)))
|
||||
'frontend-lookup
|
||||
(string->symbol (caddr args))))
|
||||
|
||||
(define (scan-dir-tree dir . cs)
|
||||
(let ((col (if (null? cs)
|
||||
'()
|
||||
(car cs)))
|
||||
(filenames (directory dir)))
|
||||
(let loop ((filenames filenames)
|
||||
(col col))
|
||||
(if (null? filenames)
|
||||
col
|
||||
(let* ((filename (car filenames))
|
||||
(fpath (make-pathname dir filename)))
|
||||
(if (directory-exists? fpath)
|
||||
(loop (cdr filenames)
|
||||
(scan-dir-tree fpath col))
|
||||
(loop (cdr filenames)
|
||||
(cons fpath col))))))))
|
||||
|
||||
(define (load-dir-tree dir tree)
|
||||
(let ((dir-len (string-length dir)))
|
||||
(let loop ((tree tree)
|
||||
(alst '()))
|
||||
(if (null? tree)
|
||||
alst
|
||||
(let* ((fpath (car tree))
|
||||
(key (substring fpath dir-len))
|
||||
(value (with-input-from-file fpath read-u8vector)))
|
||||
(loop (cdr tree)
|
||||
(cons (cons key value)
|
||||
alst)))))))
|
||||
|
||||
(define (make-tree-module dir name getter)
|
||||
(let* ((tree (scan-dir-tree dir))
|
||||
(alst (load-dir-tree dir tree)))
|
||||
`(module ,name (,getter)
|
||||
(import scheme srfi-4 (chicken base))
|
||||
(define alst ',alst)
|
||||
(define (,getter key . vs)
|
||||
(let ((klst (assoc key alst)))
|
||||
(if klst
|
||||
(cdr klst)
|
||||
(if (null? vs)
|
||||
(error ,getter "key not found" key)
|
||||
(car vs))))))))
|
||||
|
||||
(define (compile-tree-module dir name getter)
|
||||
(with-output-to-file (format "~a.scm" name)
|
||||
(lambda ()
|
||||
(write (make-tree-module dir name getter))
|
||||
(newline))))
|
||||
|
||||
(compile-tree-module dir modname lookupname)
|
Loading…
Add table
Add a link
Reference in a new issue