Brandon Invergo

Release of guile-file-names 0.2

I’m happy to announce the release of guile-file-names 0.2.

The (file-names) module provides methods for manipulating file names. Its design distinguishes between the human-friendly string format of filenames ("/usr/bin/guile") and a more Scheme-friendly representation to take out all the little nuisances of working with file names.

This release sees bugs fixed, under-the-hood improvements, and new features added. See below for an excerpt from the NEWS file.

Download [sig]

If you use the library, please consider reporting any bugs you encounter or feature requests you might have on the issue tracker on Gitlab.



Native file-globbing sub-module

A new sub-module (file-names glob) has been added. This module provides the <file-name> method glob, which is used to perform "file-globbing." File-globbing is the method of finding multiple files, e.g. at the shell, by matching wildcards (e.g. "/usr/lib/*.so").

glob supports shell-style wildcards (*, ?, [] and **) as well as full regular expressions.

string->file-name now takes optional keyword arguments

This allows you to override system- or parsed- defaults for the volume, separator and case-sensitivity.

New <file-name> methods remove-prefix and remove-prefix!

These new methods convert an absolute file name to a relative one by removing a leading directory prefix.

Specialized write and display methods for <file-name> objects

Running write or display on a <file-name> object now prints a recognizable string representation of the file name rather than the default cryptic GOOPS-object format:

scheme@(guile-user)> (use-modules (file-names))
scheme@(guile-user)> (define f (string->file-name "/usr/bin/guile"))
scheme@(guile-user)> (simple-format #t "~a\n" f)
#<<file-name> /usr/bin/guile>


Resolving an absolute file name

It is now an explicit error if there are double-dots at the root of the file name (e.g. "/../foo/bar"). Also, a bug was fixed where sequential double-dots ("../../../blah.txt") were not handled correctly.

file-name=? now behaves correctly for relative file names.