Yearly Archives: 2011

2011-12-02

Emacs Lispの書き方が分からない

Emacs Lispってたまに書くけど、いまだにちゃんとした書き方がよく分からない。

例えばバッファ内を正規表現検索してマッチした文字列からなるリストを作りたいとき。

(save-excursion
  (let (result)
    (while (re-search-forward "[0-9]+" nil t)
      (setq result (append result (list (match-string 0)))))
    result))

毎回appendするのは効率が悪そう。

(save-excursion
  (let (result)
    (while (re-search-forward "[0-9]+" nil t)
      ;;↓(require 'cl)していいなら(push (match-string 0) result)
      (setq result (cons (match-string 0) result)))
    (nreverse result)))

一番書きやすそうなコードだけど、reverseするくらいなら最初から後ろへつなげていけば良いんじゃね?

(save-excursion
  (let (head tail)
    (while (re-search-forward "[0-9]+" nil t)
      (let ((number (match-string 0)))
        (if tail (setq tail (setcdr tail (list number)))
          (setq head (setq tail (list number))))))
    head))

一番最初headもtailもnilから始まるのがやっかい。ループの中で毎回nil判定するのは無駄。

(save-excursion
  (if (re-search-forward "[0-9]+" nil t)
      (let* ((head (list (match-string 0)))
             (tail head))
        (while (re-search-forward "[0-9]+" nil t)
          (setq tail (setcdr tail (list (match-string 0)))))
        head)))

時間的な効率は良さそうに見える(要検証)けど、re-search-forwardやmatch-stringを二回書かなきゃいけないのがイヤな感じ。

というわけで、結局どう書くのが一番良いのかいまだに分からない。実行速度なんかはちゃんと検証した方が良いんだろうなぁ。

clとかあまり使ったこと無いし、マクロとかもほとんど使ったこと無い。たまに書くだけだからまだまだ知らないことが沢山あるなぁ。そういえばclって積極的に使って良い物なの? 上の例でもpush使おうか迷ったんだけど……。

普段Lispを使っている方はこういうときどう書くんでしょう。

2011-11-29

間取りゲー

この発想はなかった。

この手の図面って見てるだけでワクワクしちゃうよね。

似たようなゲームはなかったのかなと調べてみたら、少し形態は違うけどMADRISMというXboxインディーズゲームがあったらしい。

キッチン多すぎ(笑) 2LDKとかいって消えていくところが可笑しい。

四畳半神話体系のEDを連想したり。

2011-11-28

ZEBRAのサラサ

だいぶ前に何種類か買ったボールペンの中で、気がつけばサラサばかり使っていることに気がついた。書き味がなめらかで気持ちがいい。今持っているのは0.4mmの2色+シャーペンと0.5mmのブルーブラック。0.5mmの黒を買おう。