より移植性の高い方法は、パス名と動的バインディングを使用すること*default-pathname-defaults*
です。これにより、現在の作業ディレクトリが効果的に設定されます。今日も同じ問題がありました。以下は、Conrad Barski による Land of Lisp のテキストを実際に適用したもので、現在の作業ディレクトリを指定していdot->png
ます。
(defun dot->png (filespec thunk)
"Save DOT information generated by a thunk on a *STANDARD-OUTPUT* to a FILESPEC file. Then use FILESPEC to create a corresponding png picture of a graph."
;; dump DOT file first
(let ((*default-pathname-defaults*
(make-pathname :directory (pathname-directory (pathname filespec)))))
;; (format t "pwd (curr working dir): ~A~%" *default-pathname-defaults*)
(with-open-file (*standard-output*
filespec
:direction :output
:if-exists :supersede)
(funcall thunk))
#+sbcl
(sb-ext:run-program "/bin/sh"
(list "-c" (concatenate 'string "dot -Tpng -O " filespec))
:input nil
:output *standard-output*)
#+clozure
(ccl:run-program "/bin/sh"
(list "-c" (concatenate 'string "dot -Tpng -O" filespec))
:input nil
:output *standard-output*)))
これが、同様の状況にあり、このスレッドを実行している誰かに役立つことを期待して投稿しました。