2004-09-25 [長年日記]

明日のコーディングスタイル

代入文が (中略) てことで、誰か nvi か Vim のもここらへん(↓)にきぼんぬでござるー。

Ruby

だと1瞬でできるのにね。実質2行だし。
src = ARGF .read
max = src .split(/\n/) .grep(/^\s*(\S+)\s*=/) {$1.size} .max
dst = src .gsub(/^(\s*)(\S+)\s*=\s*(.*?)$/m) { format("%s%-#{max}s = %s", $1, $2, $3) }
print dst

C#

で試しに書いてみたら56行で萎え。文字列処理はRubyの得意分野であることを差し引いてもこれはヒドイ。一番の原因(違い)はブロックの有無。gsub の replacement の部分を実現するのにわざわざデリゲータ(MatchEvaluator)を定義しないといけないのは辛い。Rubyを知らなければ堪えられるのかもしれないが、一度手にした文明は捨てられんのですよ。C#2.0(Visaul C# 2005)からは匿名メソッドが使えるので、同じ処理が簡潔になることを祈る。

速度比較

を試しにやってみた。
% time cat code.txt | ruby indent.rb 
ruby indent.rb  0.02s user 0.01s system 109% cpu 0.027 total
% mcs indent.cs
% time cat code.txt | ./indent.exe
./indent.exe  0.27s user 0.06s system 38% cpu 0.846 total
10倍以上違う。コーディングの内容が若干違う(C#側では1文字ずつ読み込んでたり)のもあるが、多分 nomo 起動のオーバーヘッドが大きそうな予感(全体の実行時間も短いから余計顕著に)。手元の Windows で indent.exe を実行したらかなり速かったし、間違いない!って、あなた、CeleとP4の違いがありますからー、残念!というか、ここらへんのバイナリ互換っぷりが凄い楽しい>.NET Framework。

てことで

emacs-lisp はもういいや。今日も call-process-region で綺麗にラッピングして逃げよう。コードはもちろん Ruby 版を採用。(プチ変名)
(defun equal-indent-region ()
  (interactive)
  (if (> (point) (mark))
      (exchange-point-and-mark))
  (call-process-region (point) (mark) "indent-equal.rb" t t t)
)
(global-set-key "\C-c=" 'equal-indent-region)
あとはC-c=を打つべし!打つべし!あー、綺麗に揃うわい。適材適所マンセー。

さらに

vi なら ~/.exrc に
map = :'a,'b !indent-equal.rb
とかなんとか書いておけば、 '=' [ENTER] で揃いまくり。ヤター。
本日のツッコミ(全1件) [ツッコミを入れる]
_ かさ (2004-09-27 01:21)

そろえるんだからキーワードは align で。でも cc-align.el にはそういう関数はないようで…。


サイト内検索 (by Google)

| JRuby | Rails | Berryz | ℃-ute | エッグ | jQuery |

過去

2004年
9月
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30

未来

コンタクト