4

I want to be able to translate a certain directory in my homedirectory on any OS to the actual absolute path on that OS e.g. (make-pathname :directory '(:absolute :home "directoryiwant") should be translated to "/home/weirdusername/directoryiwant" on a unixlike system.

What would be the function of choice to do that? As

(directory-namestring 
      (make-pathname :directory '(:absolute :home "directoryiwant"))
> "~/"

does not actually do the deal.

Sim
  • 4,199
  • 4
  • 39
  • 77

2 Answers2

9

If you need something relative to your home directory, the Common Lisp functions user-homedir-pathname and merge-pathnames can help you:

CL-USER> (merge-pathnames 
          (make-pathname
           :directory '(:relative "directoryyouwant"))
          (user-homedir-pathname))
#P"/home/username/directoryyouwant/"

The namestring functions (e.g., namestring, directory-namestring) work on this pathname as expected:

CL-USER> (directory-namestring
          (merge-pathnames 
           (make-pathname
            :directory '(:relative "directoryyouwant"))
           (user-homedir-pathname)))
"/home/username/directoryyouwant/"
Joshua Taylor
  • 84,998
  • 9
  • 154
  • 353
4
CL-USER > (make-pathname :directory (append (pathname-directory
                                              (user-homedir-pathname))
                                            (list "directoryiwant"))
                         :defaults (user-homedir-pathname))

#P"/Users/joswig/directoryiwant/"

The function NAMESTRING returns it as a string.

CL-USER > (namestring #P"/Users/joswig/directoryiwant/")
"/Users/joswig/directoryiwant/"
Rainer Joswig
  • 136,269
  • 10
  • 221
  • 346