gcl-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Gcl-devel] pathnames


From: Dennis Decker Jensen
Subject: [Gcl-devel] pathnames
Date: Fri, 27 Feb 2004 14:32:56 +0000

Hi Camm

Sorry for putting up new thread, but I deleted your mail by
mistake.

I've been playing with pathnames in CLisp and SBCL to find out
more from other actual implementations, and there are notable
differences in how it can be done.

I will not go into too much details.  The most significant
difference to GCL's old (CLTL2?) implementation is in the
pathname-directory component of a pathname.

In ANSI the directory component (a list) must start with either
the symbol RELATIVE or the symbol ABSOLUTE.  From there only
strings and the symbols UP or BACK are allowed.  The difference
between the latter and the former is a matter of syntactic or
semantic behaviour.

How the namestrings are constructed depends upon the
implementation.  SBCL don't accept BACK at the moment when
constructing namestrings, while CLisp has both UP and BACK
taking semantic behaviour.  SBCL does't touch it's pathnames,
while CLisp does at creation time as you can see below in the
examples.

GCL currently uses symbols as well as strings with the special
symbols ROOT, CURRENT and PARENT which has special meanings.
I gather this is the CLTL2 way.  None of this is ANSI anyway.

There are further constraints on some of the other components,
but I don't think it is all needed at once judged by the other
implementations and the diversity among them.

Examples:

<<<CLisp>>>

;; Dribble of #<IO TERMINAL-STREAM> started 2004-02-27 14:07:39
#<OUTPUT BUFFERED FILE-STREAM CHARACTER #P"clisp.pathnames">
[2]> (make-pathname :directory '(:relative "a" "b" "c"))
#P"a/b/c/"
[3]> (make-pathname :directory '(:absolute "a" "b" "c"))
#P"/a/b/c/"
[4]> (make-pathname :directory '(:absolute "a" "b" :up "c"))
#P"/a/c/"
[5]> (make-pathname :directory '(:absolute "a" "b" :back "c"))
#P"/a/c/"
[6]> (pathname-directory (make-pathname :directory '(:absolute "a" "b" :back 
"c")))
(:ABSOLUTE "a" "c")
[7]> (pathname-directory #P"/a/b/../c/")
(:ABSOLUTE "a" "c")
[8]> (pathname-directory #P"/a/b/c/")
(:ABSOLUTE "a" "b" "c")
[9]> (pathname-directory #P"/a/b/c")
(:ABSOLUTE "a" "b")
[10]> (dribble)
;; Dribble of #<IO TERMINAL-STREAM> finished 2004-02-27 14:10:07

;; Dribble of #<IO TERMINAL-STREAM> started 2004-02-27 14:28:08
#<OUTPUT BUFFERED FILE-STREAM CHARACTER #P"clisp.pathnames">
[2]> (make-pathname :directory '("a" "b" "c"))

*** - MAKE-PATHNAME: illegal :DIRECTORY argument ("a" "b" "c")
Break 1 [3]> :q

[4]> (make-pathname :directory '(:relative "a" "b" "c"))
#P"a/b/c/"
[5]> (make-pathname :directory '(:relative "a" "b" :parent "c"))

*** - MAKE-PATHNAME: illegal :DIRECTORY argument (:RELATIVE "a" "b" :PARENT "c")
Break 1 [6]> :q

[7]> (make-pathname :directory '(:relative "a" "b" :current "c"))

*** - MAKE-PATHNAME: illegal :DIRECTORY argument (:RELATIVE "a" "b" :CURRENT 
"c")
Break 1 [8]> :q

[9]> (dribble)
;; Dribble of #<IO TERMINAL-STREAM> finished 2004-02-27 14:29:01


<<<SBCL>>>
* (make-pathname :directory '(:relative "a" "b" "c"))

#P"a/b/c/"
* (make-pathname :directory '(:absolute "a" "b" "c"))

#P"/a/b/c/"
* (make-pathname :directory '(:absolute "a" "b" :up "c"))

#P"/a/b/../c/"
* (make-pathname :directory '(:absolute "a" "b" :back "c"))

#<PATHNAME
  (with no namestring)
  :HOST #<SB-IMPL::UNIX-HOST {505D1B9}>
  :DEVICE NIL
  :DIRECTORY (:ABSOLUTE "a" "b" :BACK "c")
  :NAME NIL
  :TYPE NIL
  :VERSION NIL>
* (pathname-directory (make-pathname :directory '(:absolute "a" "b" :up "c")))

(:ABSOLUTE "a" "b" :UP "c")
* (pathname-directory #P"/a/b/../c/")

(:ABSOLUTE "a" "b" :UP "c")
* (pathname-directory #P"/a/b/c/")

(:ABSOLUTE "a" "b" "c")
* (pathname-directory #P"/a/b/c")

(:ABSOLUTE "a" "b")
* (pathname-directory #P"a/b/c/")

(:RELATIVE "a" "b" "c")
* (pathname-directory #P"../../")

(:RELATIVE :UP :UP)
* (pathname-directory (parse-namestring "/a/b/../c/"))

(:ABSOLUTE "a" "b" :UP "c")

* (make-pathname :directory '("a" "b" "c"))

#<PATHNAME
  (with no namestring)
  :HOST #<SB-IMPL::UNIX-HOST {505D1B9}>
  :DEVICE NIL
  :DIRECTORY ("a" "b" "c")
  :NAME NIL
  :TYPE NIL
  :VERSION NIL>
* (make-pathname :directory '(:relative "a" "b" "c"))

#P"a/b/c/"
* (make-pathname :directory '(:relative "a" "b" :parent "c"))

debugger invoked on a SIMPLE-ERROR in thread 31541:
  :PARENT is not allowed as a directory component.

* (make-pathname :directory '(:relative "a" "b" :current "c"))

debugger invoked on a SIMPLE-ERROR in thread 31541:
  :CURRENT is not allowed as a directory component.

>>>

I haven't looked at logical pathnames which is whole topic
itself.

Hope it made things a little clearer.

--
Dennis Decker Jensen





reply via email to

[Prev in Thread] Current Thread [Next in Thread]