Subject: make-pathname and :defaults
From: Erik Naggum <>
Date: 1997/12/28
Newsgroups: comp.lang.lisp
Message-ID: <>

I'm a little confused about the `defaults' arguments to `make-pathname'.
naïvely, I had imagined that the following two forms would yield the same

    (make-pathname :directory '(:relative "foo")
		   :name "bar"
		   :defaults (user-homedir-pathname))
    => #p"foo/bar"

    (merge-pathnames (make-pathname :directory '(:relative "foo")
				    :name "bar")
    => #p"/home/erik/foo/bar"

but this is not so in Allegro 4.3.1 for Unix or in CMUCL 17f, which agree
on the values.

the specification for `make-pathname' reads (quoted from the HyperSpec):

    After the components supplied explicitly by HOST, DEVICE, DIRECTORY,
    NAME, TYPE, and VERSION are filled in, the merging rules used by
    `merge-pathnames' are used to fill in any _unsupplied_ components from
    the defaults supplied by DEFAULTS.  [my emphasis]

standing by itself, this could be taken to support the implementation in
ACL 4.3.1 and CMUCL 17f, but the specification for `merge-pathnames' reads:

    Constructs a pathname from PATHNAME by filling in any _unsupplied_
    components with the corresponding values from DEFAULT-PATHNAME and
    DEFAULT-VERSION.  [my emphasis]

which might be interpreted to mean that "unsupplied" in `make-pathname' and
`merge-pathnames' are the same, and then defined only in `merge-pathnames',
whose specification goes on to say:

    Pathname merging treats a relative directory specially.  If
    (pathname-directory pathname) is a list whose car is :relative, and
    (pathname-directory default-pathname) is a list, then the merged
    directory is the value of

	(append (pathname-directory default-pathname)
		(cdr  ;remove :relative from the front
		  (pathname-directory pathname)))

    except [specification of :back processing].

which is clearly intended to _override_ the meaning of "unsupplied" in
entirely intuitive ways.

my question is whether the special treatment of relative directories also
overrides the "unsupplied" in `make-pathname' since it defers the handling
of "unsupplied" arguments to `merge-pathnames'.  I would tend to think it
should.  comments?  (Kent?)

The year "98" was new 1900 years ago.  |  Help fight MULE in GNU Emacs 20!
Be year 2000 compliant, write "1998"!  |