I have been copy-pasting the same code over and over and decided to wrap it up in trivial-project-pathname, which is a very simple Common Lisp library for resolving pathnames relative to some directory, usually the sources.
The typical use case looks like this: I am working on, say, some data analysis and I have the following directory structure:
data/ | where data files are kept |
latex/ | LaTeX sources |
lisp/ | Common Lisp code, including ASDF system definition |
plots/ | plots (potentially generated from Lisp) |
I want to be able to write something like
(analyze-data-and-save-plot (project-path "mydata.csv" :data) (project-path "myplot.pdf" :plots))
and have the data read from data/mydata.csv
and the plot saved to plots/myplot.pdf
.
This is how I would do it using this library:
(project-pathname:define project-path (:asdf "myproject" '(:relative :up)) (:data "data/") (:plots "plots/"))
This finds the directory for the .asd
file, takes its parent directory, and then defines a function that maps symbols to subdirectories.
Unless otherwise specified, NIL
, the default for the optional parameter, would map to the base directory. You don't even need to use subdirectories, you can just
(project-pathname:define project-path2 (:asdf "myproject")) ;;; and then use (project-path2 "my-data-file.csv")
You can also use *load-truename*
to define *base-directory*
in the .asd
file as recommended by Zach Beane and then define
(project-pathname:define project-path (:directory *base-directory*))