Index: path-glob/path-glob.scm ================================================================== --- path-glob/path-glob.scm +++ path-glob/path-glob.scm @@ -1,26 +1,28 @@ (define (multi-glob pathspec) (let* ((path-parts (intersperse (string-split pathspec "/" #t) "/"))) + (print "path-parts: " path-parts) (if (null? path-parts) '() (let loop ((parts (cdr path-parts)) (result (let ((p (car path-parts))) (if (string=? p "") - '("/") + '("") (glob (car path-parts)))))) (if (null? parts) result (let* ((part (car parts)) (rem (cdr parts))) (loop rem (apply append (map (lambda (curr) (let ((new (string-append curr part))) + (print "new: " new " part: " part) (cond ((and (directory? curr)(file-read-access? curr)) (glob new)) - ((member part '("." ".." "/")) new) + ((member part '("." ".." "/")) (list new part)) (else '())))) result))))))))) ;; alternative implementation @@ -30,11 +32,15 @@ '() (glob-expand (car parts) (cdr parts)) ))) (define (glob-expand pattern #!optional (rest '())) - (let ((result '()) (expanded (glob pattern))) - (apply append result (cond - ((null? expanded) (list '())) - ((null? rest) (list expanded)) - (else (map (lambda (x) (if (directory? x) (glob-expand (conc x "/" (car rest)) (cdr rest)) '())) expanded)) - )))) + (let ((result '()) + (expanded (glob pattern))) + (apply append result (cond + ((null? expanded) (list '())) + ((null? rest) (list expanded)) + (else (map (lambda (x) + (if (directory? x) + (glob-expand (conc x "/" (car rest)) (cdr rest)) + '())) + expanded)))))) Index: path-glob/test.scm ================================================================== --- path-glob/test.scm +++ path-glob/test.scm @@ -1,11 +1,11 @@ (use test posix srfi-1) (load "path-glob.scm") (define globbers `((multi-glob . ,multi-glob)(path-glob . ,path-glob))) (define interesting-patts '("../*/*" "/*/bin/*" "./*/bin/*")) -(define simple-patts '("../*" "/*" "/bin/*" "." ".." "*")) +(define simple-patts '("../*" "/*" "/bin/*" "." ".." "*" "a[0-1]*")) (define (trim-list lst) (if (> (length lst) 3) (append (take lst 3) '(...)) lst)) @@ -14,11 +14,11 @@ (write (conc "patt: " patt (make-string (- 10 (string-length patt)) #\ )))) (print "\nCompare each globber with glob") ;; can only do one level globs here (for-each (lambda (globber) - (print "\n\nGlobber: " globber) + (print "\nGlobber: " globber " vs glob") (for-each (lambda (patt) (generate-prefix patt) (test #f '() (trim-list (lset-xor string=? ((alist-ref globber globbers) patt)(glob patt))))) @@ -31,14 +31,14 @@ (generate-prefix patt)(test #f #t (list? (path-glob patt))) (generate-prefix patt)(test #f #t (list? (multi-glob patt))) ) interesting-patts) -(print "Compare the globbers") +(print "\nCompare the globbers against each other") (for-each (lambda (patt) (generate-prefix patt) (test #f '() (trim-list (lset-xor string=? (path-glob patt)(multi-glob patt))))) interesting-patts) (test-exit)