[Openmcl-devel] Troubles with logical pathnames

Richard M Kreuter kreuter at progn.net
Sun Jul 16 15:42:30 PDT 2006


Hello,

In OpenMCL 1.0 (on GNU/Linux, if it matters), the operators load,
require, compile-file, and open express the following surprising
behaviors with relative logical pathnames:

* load and require report that the file named by the relative logical
  pathname doesn't exist (though probe-file returns non-nil for the
  same argument),

* compile-file and open act as if they merged the translated relative
  logical pathname with #P"/"

Below is a short program to demonstrate the behavior, along with the
output from one run.  If a longer test program that includes checks
for operators for which a relative logical pathname and its physical
pathname translation work identically is desired, I can supply that
too.

Thanks,
RmK

--
(in-package :cl-user)

;; A simple logical host that maps relative logical pathnames with no
;; directory to relative pathnames with a relative directory.
(setf (logical-pathname-translations "foo")
      `((";*.*.*" ,(make-pathname :directory '(:relative "bar")
				  :name :wild :type :wild :version :wild))))

;; A relative file name.
(defvar *relative-path* (make-pathname :directory '(:relative "bar")
				       :name "file" :type "lisp"))
;; A logical pathname that should translate to the same name
(defvar *relative-logical-path* "foo:;file.lisp.newest")
;; A pathname denoting another file in the same directory, for testing
;; rename-file.
(defvar *relative-alt-path* (make-pathname :name "altfile" :type "lisp"))

(defvar *forms*
  '((namestring (translate-logical-pathname !))
    (truename (namestring (translate-logical-pathname !)))

    (load !)
    (require (new-module) !)

    (compile-file !)
    (with-open-file (*standard-input* !)
      (read-line))))

(defun new-module ()
  (loop
     for i upfrom 0
     for module = (format nil "FILE~D" i)
     while (find module *modules* :test #'string=)
     finally (return module)))

(eval-when (:load-toplevel :execute)
  (ensure-directories-exist *relative-path*)
  (mapc
   (lambda (paths)
     (destructuring-bind (logical-path physical-path alt-path) paths
       
       (mapc
	(lambda (form)
	  (with-open-file (*standard-output* physical-path
					     :direction :output
					     :if-exists :supersede)
	    (write '(eval-when (:compile-toplevel :load-toplevel :execute)
		     (write-line "Hello from file.lisp!")
		     (force-output))))
	  (let ((lform (subst logical-path '! form))
		(pform (subst physical-path '! form)))
	    (format t "> ~S~%" lform)
	    (format t "~{~A~%~}"(multiple-value-list (ignore-errors (eval lform))))
	    (format t "> ~S~%" pform)
	    (format t "~{~A~%~}"
		    (multiple-value-list (ignore-errors (eval pform))))
	    (ignore-errors
	      (delete-file physical-path)
	      (delete-file alt-path))))
	*forms*)))
   (list (list *relative-logical-path* *relative-path* *relative-alt-path*)))
  (force-output))
--

$ openmcl -n -l ./openmcl-logical-pathname-warts.lisp
> (NAMESTRING (TRANSLATE-LOGICAL-PATHNAME "foo:;file.lisp.newest"))
bar/file.lisp
> (NAMESTRING (TRANSLATE-LOGICAL-PATHNAME #P"bar/file.lisp"))
bar/file.lisp
> (TRUENAME (NAMESTRING (TRANSLATE-LOGICAL-PATHNAME "foo:;file.lisp.newest")))
/home/kreuter/bar/file.lisp
> (TRUENAME (NAMESTRING (TRANSLATE-LOGICAL-PATHNAME #P"bar/file.lisp")))
/home/kreuter/bar/file.lisp
> (LOAD "foo:;file.lisp.newest")
NIL
File "foo:;file.lisp.newest" does not exist.
> (LOAD #P"bar/file.lisp")
Hello from file.lisp!
/home/kreuter/bar/file.lisp
> (REQUIRE (NEW-MODULE) "foo:;file.lisp.newest")
NIL
File "foo:;file.lisp.newest" does not exist.
> (REQUIRE (NEW-MODULE) #P"bar/file.lisp")
Hello from file.lisp!
FILE0
NIL
> (COMPILE-FILE "foo:;file.lisp.newest")
Hello from file.lisp!
NIL
Permission denied : "/bar/"
> (COMPILE-FILE #P"bar/file.lisp")
Hello from file.lisp!
/home/kreuter/bar/file.pfsl
NIL
NIL
> (WITH-OPEN-FILE (*STANDARD-INPUT* "foo:;file.lisp.newest") (READ-LINE))
NIL
No such file or directory : #P"/bar/file.lisp"
> (WITH-OPEN-FILE (*STANDARD-INPUT* #P"bar/file.lisp") (READ-LINE))
(EVAL-WHEN (:COMPILE-TOPLEVEL :LOAD-TOPLEVEL :EXECUTE) (WRITE-LINE "Hello from file.lisp!") (FORCE-OUTPUT))
T




More information about the Openmcl-devel mailing list