opamp_sando's blog

クソザコが割りと適当なことを書くためにある備忘録です。あとたまに普通の日記も書きます

emacsでOSで分岐するマクロを書いてみた

emacsでOSごとに分岐するマクロを書いてみた。

(defmacro cond-system (&rest slit)
  `(cond
    ,@(mapcar
       (lambda (elem)
         (let ((os-type (car elem))
               (body (cdr elem)))
           (cond
            ((listp os-type) `((or ,@(mapcar (lambda (os) `(string-match ,(symbol-name os) system-configuration)) os-type)) ,@body))
            ((eq os-type 'other) `(t ,@body))
            (t `((string-match ,(symbol-name os-type) system-configuration) ,@body))))) slit)))

多分ちゃんと動く・・・かな?

(cond-system
      (win (format "win"))
      (darwin (format "darwin"))
      (linux (format "linux"))
      ((freebsd netbsd) (format "BSD"))
      (other (format "Others")))

こんな感じで使える。

(cond
 ((string-match "win" system-configuration) (format "win"))
 ((string-match "darwin" system-configuration) (format "darwin"))
 ((string-match "linux" system-configuration) (format "linux"))
 ((or
   (string-match "freebsd" system-configuration)
   (string-match "netbsd" system-configuration))
  (format "BSD"))
 (t (format "Others")))

こんな感じに展開される。

Common Lispみたいにパッケージがあるとシンボルを使ってこんなことするのもなかなか面倒になるので、この点はemacsの良い所?な気がする。まあ、パッケージなくて困ることのほうが多い気はするけど。 本当はキーワード使おうかと思ってたけど、Emacs Lispでキーワードを文字列にする方法がわからなかったorz

Firefox ブラウザ無料ダウンロード