From: Russell M. <rus...@ya...> - 2005-06-06 12:22:10
|
Andreas Fuchs <as...@bo...> writes: > Today, Russell McManus <rus...@ya...> wrote: >> >> While writing some code using run-program, I came upon the need for >> the following: > > autobench uses a similar macro, so I have a few questions about your > code. > > One, wouldn't it be better if the macro also bound > *default-pathname-defaults* to the new-dir? (My implementation > assumes that the user(me) will consistently use > with-current-directory and so skips the whole getcwd thing in favor > of just chdir-ing back into *d-p-defaults*) I can easily be convinced that *default-pathname-defaults* should be magical in some sneaky way. I just threw together the macro that I wrote based on an immediate need, and wondered whether someone else had a fully baked solution. >> (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 "/"))) > > Two, what's with that #\\ check? In which cases does getcwd return the > \ character as the last element? This is an error in my code, the constant should be #\/, because getcwd sometimes returns a path without a trailing slash, which when parsed with parse-namestring will put the last path component into the pathname's name field rather than the final component in the directory field. -russ |