haskell 用の underscore → CamelCase 変換

最近時給が1000円を切っていることに気がついて大分凹んでいます。残業もどんどん多くなってきたしなぁ・・・。

平日はほとんど部屋でプログラミングをやる時間が取れず、休日はやる気がでないという悪循環でしたが、少し気合を入れてみるため、elispを久々に書いてみました。

haskell命名規則は、関数はjava風のCamelCase、代数的データ型とかはJavaのclassとほぼ同じ命名規則です。

で、これを一々打っていると、SandSをやっているとはいえ、かなりshiftを押す回数が増えていきます。これが大分嫌になってきたので、簡単な変換関数を書いてみました。

(defun haskell-underscore-to-camelcase ()
  (interactive)
  (let* ((bounds (bounds-of-thing-at-point 'symbol))
         (symb (buffer-substring-no-properties (car bounds) (cdr bounds)))
         (rep-func '(lambda (str)
                      (if (not (= 2 (length str)))
                          str
                        (let ((listed (mapcar 'char-to-string
                                              (string-to-list str))))
                          (upcase (cadr listed)))))))
    (save-restriction
      (when (and symb
                 (<= 2 (length symb)))

        (narrow-to-region (car bounds) (cdr bounds))
        (delete-region (point-min) (point-max))
        (insert (replace-regexp-in-string "\\(_[a-zA-Z]\\)" rep-func symb))
        (goto-char (cdr bounds))
        ))))

無駄に長いような気が多少しますが、目的は達成できてるのでよしとします。これはアンダースコアの次に続く文字だけを大文字にしているので、mapM_とかは何もいじりません。

また、関数の場合は先頭に_を付けないだけでいいので、結構よさげです。とりあえず試用ということで、key-chordで __ に割り当ててみました。

この程度の関数を書くのに30分とか・・・。最近COBOLしか見てないとこんなになってしまうのか。