私は SBCL 1.1.4 を使用していますが、pathname-directory の動作がおかしいことがわかりました。
パス名に「..」が含まれているとします。次の例は簡単です。SBCL はすべての ".." を ":UP" に変換します。
(pathname-directory "a/b/../")
(:RELATIVE "a" "b" :UP)
(pathname-directory "a/../b/../")
(:RELATIVE "a" :UP "b" :UP)
問題はここにあります:
(pathname-directory "C:/test/../")
;;=> (:ABSOLUTE "test" :UP)
(truename "C:/test/..")
#P"C:/test/../"
(pathname-directory (truename "C:/test/.."))
;;=> (:ABSOLUTE "test" "..")
(pathname-directory #P"C:/test/../")
;;=> (:ABSOLUTE "test" :UP)
truename の戻り値に対して pathname-directory を呼び出すと、".." は ":UP" に変換されません。(truename "C:/test/..") も #P"C:/test/../" を返すのに、なぜ ".." は変換されないのですか?