Matching hostnames with pcase in Elisp

I am not what you might call a “competent” Emacs Lisp programmer. More of a cargo-culter, really. But I’m trying to get better.

I create RubyTapas episodes across two different machines: “hazel”, my main development box, and “caroline”, my Windows video editing box. I needed to be able to recognize my synchronized episode directory on either machine, but the paths are different. So I wrote this:

(setq rubytapas-dir
      (cond
       ((equal (system-name) "CAROLINE")
         (concat (getenv "USERPROFILE") "\\Dropbox"))
       ((equal (system-name) "hazel")
         (expand-file-name "~/Dropbox/rubytapas"))
        (t
         (display-warning :warning "Did not recognize system")
         (expand-file-name "~/Dropbox/rubytapas"))))

This uses cond , the general-purpose conditional macro. It works, but it’s clunky. I keep repeating the string comparison code. As a Ruby programmer, I want something closer to Ruby’s pattern-matching case statement.

Today I read up on the pcase macro. It turns out it is both simpler and more powerful than I had realized. I haven’t used any of the power yet. But for this very trivial problem, it was as simple as replacing the equality tests with literal strings.

(setq rubytapas-dir
      (pcase system-name
        ("CAROLINE"
         (concat (getenv "USERPROFILE") "\\Dropbox"))
        ("hazel"
         (expand-file-name "~/Dropbox/rubytapas"))
        (_
         (display-warning :warning "Did not recognize system")
         (expand-file-name "~/Dropbox/rubytapas"))))

Easy, and nicer to look at!

Leave a Reply

Your email address will not be published. Required fields are marked *