[Ecls-list] Re: (Lisp Support Call #25967) The mysteriously "hidden" section 19.2.3 of the HyperSpec
davef at xanalys.com
davef at xanalys.com
Tue Jan 6 06:55:02 UTC 2004
Hi Edi
*DEFAULT-PATHNAME-DEFAULTS* is not quite the same as the current working
directory because it can be set (or even bound with LET), but that won't change
the real current directory.
LispWorks developers found that *DEFAULT-PATHNAME-DEFAULTS* is a major hassle if
it is bound to anything other than #p"", in particular because it affects the
type of pathname returned by PARSE-NAMESTRING and MAKE-PATHNAME. This in turn
can cause chaos if pathnames are used within the implementation of some function
that just happens to be called while *DEFAULT-PATHNAME-DEFAULTS* is bound.
We'll fix the misplaced links you found in the Hyperspec.
Regards,
Dave Fox
Xanalys Technical Support
http://www.lispworks.com/support/
Subject: (Lisp Support Call #25967) The mysteriously "hidden" section 19.2.3
of the HyperSpec
The following message is a courtesy copy of an article
that has been posted to comp.lang.lisp as well.
The CLHS has a section 19.2.3[1] entitled "Merging Pathnames" which,
judging from its number, should be linked from 19.2[2] but
isn't. Instead, it is linked from 19.2.2.4[3].
19.2.3 contains the sentence
"Except as explicitly specified otherwise, for functions that
manipulate or inquire about files in the file system, the pathname
argument to such a function is merged with *DEFAULT-PATHNAME-DEFAULTS*
before accessing the file system (as if by MERGE-PATHNAMES)."
On my machine, at least two CL implementations (CMUCL 18e and ECL
0.9c) get this wrong:
* (setf *default-pathname-defaults* #p"/tmp/bar/")
#p"/tmp/bar/"
* (probe-file "fump")
#p"/tmp/fump"
On a related note, I was wondering why several Lisps have a concept of
a "current working directory" which seems to exist in parallel (and
maybe even in an incompatible way) to *DEFAULT-PATHNAME-DEFAULTS*.
Some examples:
1. In LispWorks[4], CMUCL, and CLISP (and probably others) the initial
value of *DEFAULT-PATHNAME-DEFAULTS* is always #p"" no matter where
you started your Lisp image from although the HyperSpec gives the
hint that the value should be "typically in the working directory
that was current when Common Lisp was started up."
2. CMUCL (EXTENSIONS:DEFAULT-DIRECTORY), LispWorks (HCL:CHANGE-DIRECTORY
and HCL:GET-WORKING-DIRECTORY), and AllegroCL (EXCL:CURRENT-DIRECTORY
and EXCL:CHDIR) (and probably others) provide means to query and
manipulate a pathname which is detached from
*DEFAULT-PATHNAME-DEFAULTS*.
Is this because these functions existed before the ANSI standard was
finalized and backwards compatibility was deemed more important than a
consistent interface? I think this is a pity because (unless I'm
missing something) *DEFAULT-PATHNAME-DEFAULTS* would be a fine, Lisp-y
way to map the Unix/Windows concept of "the current directory" to CL.
Cheers,
Edi.
PS: Copies of this article have been sent to the CMUCL and ECL mailing
list as well as to Xanalys support (as they seem to be the CLHS
maintainers). My apologies if this has been fixed already.
[1] <http://www.lispworks.com/reference/HyperSpec/Body/19_bc.htm>
[2] <http://www.lispworks.com/reference/HyperSpec/Body/19_b.htm>
[3] <http://www.lispworks.com/reference/HyperSpec/Body/19_bbd.htm>
[4] However, although LispWorks seems to adher to 19.2.3, if the value
of *DEFAULT-PATHNAME-DEFAULTS* is a relative directory, the result
of merging a filespec with *DEFAULT-PATHNAME-DEFAULTS* will be
merged again with LispWorks' "working directory."
More information about the ecl-devel
mailing list