著作一覧 |
最近、立て続けにシグナルが関係しそうないやんな現象に遭遇する。
こないだ、かへいさんと話していてどっちかが気付いたこと。おれかな? かへいさんかな?
RubyとLISPは似ているってのは、気付くも何も、似ているからまあいいんだけど、コードそのものだ。
思い出した。元はかへいさんが、LISPの最後のカッコのことを言い出したのであった。blink-matching-parenがなきゃ書けないよねってことを
;;これくらいしか、手元から出てくるのがない。たかだか4個(6行目は5個)だが (defun next-window-line (n) (interactive "p") (let ((cur-col (- (current-column) (save-excursion (vertical-motion 0) (current-column))))) (vertical-motion n) (move-to-column (+ (current-column) cur-col))))
でも、慣れると平気みたいだよ、とのこと。
で、あああああああ、これだ! と気付いた。
# いい加減な例。たかだか4end def foo(a) (1..100).each do |i| a.collect do |x| #いい加減というか、何かバグらしい if i % 2 == 0 x else x + 1 end end end end
いい加減な例じゃないと、あっという間にend8段だのend10段だのになる。でも、ネストしてるわりに全体が読みにくいわけでもない。なぜだ?
returnを明示する必要がないってことが理由の1つだというのは気付いている。
重要なことは、doの行(+1)に入っているからかも知れない。end8段なら、先頭8〜16行を読めばたいていのことはわかる。
だから、最後にendがだがだが並んでいても無視できるのであった。戻り値はendが並んでいる限り、最初のdoの戻り値か、さもなきゃ最後に評価した値になるわけだし。
この、お尻の部分に、(プログラムの内容を読解するのにはどうでも良いといえばどうでも良い)、文字通りの帳尻合わせの塊が来るところが、LISPに似ているのであった。
もし、本当に、最後に他の値が入らないendがだがだが並ぶのが、頻出するのであれば、スーパーendとかあると楽でしょうな。
def foo(a) (1..100).each do |i| a.collect do |x| if i % 2 == 0 x else x + 1 END # ← スーパーendは帳尻を合わせる。でも、classを閉じるのはかんべんな。同じインデントのところまでの帳尻を合わす。
ジェズイットを見習え |
そして、極端な話インデントちゃんとしていればendすべていらないよねという話に・・・(そしてPythonへ
Pythonと違って、あくまでも物臭オプションということで。