今日は「RHG読書会」。『Rubyist Magazine 出張版』のコラムだけ読むというマニアックな回。案の定、タブ幅とBDDの話で盛り上がり。
タブといえば、 C/C++では、わたしは少し前には、
if (some_condition()) {
some_proc1();
some_proc2();
:
} else {
:
}
みたいな風に書いてたんですが、 if の場合、条件の開始と本文の開始が揃っているのがたいへん居心地悪く感じる次第です。いまはコーディングスタイルはこのままにインデント幅は2。
で、肝心のインデント幅については、最近わりとどうでもいいような気がしてきました。で、それはなぜかということを今日、本を読みながらあれこれ考えてきたんですが、字下げの幅って文脈によって変わるからなのかなあと。たとえば lisp だとこんな感じ。
(define (same-circular? l1 l2)
(define (check c1 c2)
(let loop ((c3 (cdr c1)))
(cond ((eq? c2 c3) #t)
((eq? c1 c3) #f)
(else (loop (cdr c3))))))
(check (chased-cell l1) (chased-cell l2)))
ま、こんな風に(コードは手元の適当なコードから取ってきたので気にしないように)。基本的な構文の字下げ幅はこの場合2ですが、 cond や if なんかの構造はそうとばかりはいえないし、 let の変数束縛はまたちがったインデントルールを持っていたりとか。
で、この場合には、ハードタブでこういう見た目を表現するのは不可能なのであり、必然的にソフトタブが勝利するのではないか、などとソフトタブ派のわたしは思うのでした。おしまい。
……って思ったんだけど、べつに Lisp とかじゃなくても、メソッド呼び出しの引数を複数行にまたがって書く場合とかでは同じか。
obj.method(argument1, argument2,
(cond1)? argument3 : argument4)
みたいに書くときには任意長の字下げ幅を持たないといけない。そういえば、たださんは何かのインタビューで「折り返しはやらない。エディタの幅を広げる方がいい」と主張していた気がするけど(るびまのインタビューだったか)。