Copyright © 2003-2005, Peter Seibel
15. Practical: A Portable Pathname Library
As I discussed in the previous chapter, Common Lisp provides an abstraction, the pathname, that’s supposed to insulate you from the details of how different operating systems and file systems name files. Pathnames provide a useful API for manipulating names as names, but when it comes to the functions that actually interact with the file system, things get a bit hairy.
The root of the problem, as I mentioned, is that the pathname abstraction was designed to represent filenames on a much wider variety of file systems than are commonly used now. Unfortunately, by making pathnames abstract enough to account for a wide variety of file systems, Common Lisp’s designers left implementers with a fair number of choices to make about how exactly to map the pathname abstraction onto any particular file system. Consequently, different implementers, each implementing the pathname abstraction for the same file system, just by making different choices at a few key junctions, could end up with conforming implementations that nonetheless provide different behavior for several of the main pathname-related functions.
However, one way or another, all implementations provide the same basic functionality, so it’s not too hard to write a library that provides a consistent interface for the most common operations across different implementations. That’s your task for this chapter. In addition to giving you several useful functions that you’ll use in future chapters, writing this library will give you a chance to learn how to write code that deals with differences between implementations.