From: Russell M. <rus...@ya...> - 2005-06-05 17:42:15
|
Christophe Rhodes <cs...@ca...> writes: > Russell McManus <rus...@ya...> writes: > >> While writing some code using run-program, I came upon the need for >> the following: >> >> (defmacro with-current-directory ((new-dir) &body body) >> (let ((start (gensym))) >> `(let ((,start (sb-unix:posix-getcwd))) >> (unless (char= #\\ (aref ,start (1- (length ,start)))) >> (setf ,start (concatenate 'string ,start "/"))) >> (setf ,start (parse-namestring ,start)) >> (unwind-protect >> (progn >> (sb-posix:chdir ,new-dir) >> ,@body) >> (sb-posix:chdir ,start))))) >> >> Is there an already existing way to do this sort of thing? > > No. There is at least a plausible argument that RUN-PROGRAM should > respect *DEFAULT-PATHNAME-DEFAULTS* by chdir()ing to the directory > component, which would allow the user to request a different directory > for run-program simply by binding it. On the other hand, RUN-PROGRAM > is already a deeply scary mess of options, and adding another doesn't > really appeal... I agree about *DEFAULT-PATHNAME-DEFAULTS*, and indeed I tried this first, hoping that it would "just work". I would be willing the change run-program to work in this way: is this of interest? The reason I didn't do this first is because I wasn't sure whether there was an existing way to achieve what I wanted. I agree that this probably should not be an additional keyword option to RUN-PROGRAM. If a patch to RUN-PROGRAM is not desired, then I put the above code in the public domain, hopefully to be included with sbcl. -russ |