Zach Beane (xach) wrote,

Tilde for SBCL convenience

Every now and then I want to use leading tildes in SBCL pathnames. That is, something like this:

(probe-file "~/.emacs") =>
   #P"/home/xach/.emacs" 
OR #P"/Users/xach/.emacs"
OR #P"/usr/u/xach/.emacs"

I know about user-homedir-pathname, but it's not quite convenient for interactive REPL use.

So I put together a short file that patches SBCL internals slightly so leading tildes in pathnames go through the POSIX getpw interface to look up home directories. It's not something I'll ever use in source files, but it's pretty convenient interactively.

To use it yourself, just download tilde.lisp and add this to your ~/.sbclrc:

(load "/path/to/tilde.lisp")
(tilde:install-tilde-expander)

After that, you can use "~/foo" and "~bob/foo" in SBCL pathnames.

update Here's a git repo for tilde.lisp, with an ASDF system file too.

Tags: lisp
  • Post a new comment

    Error

    Anonymous comments are disabled in this journal

    default userpic

    Your reply will be screened

    Your IP address will be recorded  

  • 9 comments

patrickwonders

July 9 2008, 18:36:55 UTC 4 years ago

Awesome... thanks...

patrickwonders

July 9 2008, 18:52:12 UTC 4 years ago

Of course, this ran me smack into a thing that I've never gotten sorted out in my head....
I wanted to do this:

#+sbcl
(and (load #P"/Users/pat/.sbcl/tilde.lisp")
(tilde:install-tilde-expander))

Unfortunately, that yells and screams about there being no namespace 'tilde'. I would have thought that the conditional evaluation in the 'and' would have kept the reader from thinking that tilde:install-tilde-expander was necessarily a symbol. But, no dice.

I had hoped to get around it with a bunch of jumping through (eval-when ...) stuff, but again, no dice...

Any clues would be appreciated....

xach

July 9 2008, 19:01:45 UTC 4 years ago

The reader must read the whole list starting with AND before evaluating it. There's a reason I put the commands in two different forms...

Anyway, if I were you, I'd use #+sbcl twice. Another option (that doesn't much appeal to me) is something like this:

#+sbcl
(when (load "tilde.lisp") (funcall (read-from-string "tilde:install-tilde-expander")))

patrickwonders

July 9 2008, 19:13:08 UTC 4 years ago

Ah, right... I suppose it's the reader's job to intern symbols even if the form isn't going to get evaluated....

I do have it in separate forms, but I've stumbled before trying to get similar things to work and was afraid that calling load from somewhere other than the top-level meant that all the stuff it created got thrown out when load returned. But, I would guess that instead it's the same sort of thing with the reader trying to intern symbols even though they might not get evaluated.

And, yep... the "read-from-string" offends my sensibility, too. :). I'll just assume the load's going to succeed.

Thanks.

Anonymous

July 9 2008, 22:20:39 UTC 4 years ago

Simpler approach

I've been using something like this from hefner (http://ahefner.livejournal.com/5984.html) for a while:
   (defun ~ (name) (merge-pathnames name (user-homedir-pathname)))
It has the advantage of being plain CL.

Anonymous

July 10 2008, 08:07:22 UTC 4 years ago

clbuild

Would you consider turning tilde.lisp into a git archive with an asd file, so that I can add it to clbuild?

David

xach

July 10 2008, 11:20:36 UTC 4 years ago

Re: clbuild

Ok, here it is:

http://github.com/xach/tilde/tree/master

Anonymous

July 10 2008, 12:51:46 UTC 4 years ago

Re: clbuild

Great, thanks. clbuild users can now run:

$ clbuild update tilde
$ clbuild dumpcore tilde

and then test it with:

$ clbuild preloaded

Slime users wouldn't run preloaded, but can enable START_SLIME_USING_CORE in clbuild.conf for the same effect.


David

Anonymous

July 11 2008, 09:38:30 UTC 4 years ago

But what if there's a tilde in my path to tilde.lisp?

The recursion ... the bootstrapping goggles do nothing! ...