佐々木幹郎『パステルナークの白い家』

晴。
早起き。
音楽を聴く。■バッハ:無伴奏フルートのためのパルティータBWV1031(ラインハルト・ゲーベル、ムジカ・アンティクヮ・ケルン、参照)。■モーツァルトクラリネット協奏曲K.622(デイヴィッド・シフリン、ジェラード・シュワルツ)。バセット・クラリネットを使っている由。

Mozart: Clarinet Concerto; Clarinet Quintet

Mozart: Clarinet Concerto; Clarinet Quintet

ブラームス:ヴァイオリン・ソナタ第三番op.108(スパーフ、ウェステンホルツ、参照)。■アイヴズ:ヴァイオリン・ソナタ第三番(ハーン、リシッツァ、参照)。変な曲。でも結構いい。
早朝出勤。早起きしたせいであろう、午前中ものすごく眠たくて閉口する。アホだな。

図書館から借りてきた、佐々木幹郎パステルナークの白い家』読了。何の気なしに図書館の棚から抜いてきたものである。初めて読む著者で、最初は端正な文章の、毒にも薬にもならない詩人のエッセイかと思ったのだが、すぐに自分の愚かさに気づいた。それにしても、本物というのはどこで出くわすか、わかったものではない。普通に上手い文章もあるし、現実を題材にしているというだけで、優れた短編小説のようにあざやかな印象を与えられたものも少なくなかった。あまり分析的に語る気が起きないが、このような端正な文章で、深い情感を内に込めるのは容易なことではない筈である。繰り返すけれど、これは毒にも薬にもならない文章と紙一重なのだが、その紙一重が天と地ほどにもちがうのだ。や、いい書き手と巡り会いました。しかし、著者のことは殆ど無知だった。どういうものだろうか。
パステルナークの白い家 (りぶるどるしおる)

パステルナークの白い家 (りぶるどるしおる)


Ruby をやり出したのっていつ頃かとブログを見てみたら、だいたい去年の最後くらいから始めたようである。これで半年ちょっとか。意外と最近だな。プログラミング自体に関するいちばん古い記事は、2014年1月12日のそれらしい。本を買ったという。これからでも、まだ一年半くらいだな。何か随分前だったような気がしているが。JavaScript から始めたのだった。それからある程度 Perl をやって、で Ruby という経緯。どうして Perl だったのかな。もうよく覚えていない。

このところ、空き時間によく id:keyesberry さんの Ruby に関する記事を読んでいる。ブログ記事だから、短時間読むのにちょうどいい。ユニークなんだよね。
大したことではないのだが、そのブログのここで、おもしろいコードを見た。普通

[1, 2, 3, 4].map {|x| x * 2}   #=>[2, 4, 6, 8]

と書くところを、

def multi_list(ar)
  if ar.empty?
    []
  else
    num = ar.pop
    multi_list(ar) << num * 2
  end
end

multi_list([1, 2, 3, 4])   #=>[2, 4, 6, 8]

とあった。もちろんブログ主はわかってこういう回りくどい書き方をしているわけだが、こんな風に再帰を使っても書けるのだね。なるほどなあ。
 再帰は自由に使いこなせるようにならないとね。
上は、自分流で書くならこんな風かな。殆ど変らないけれど。

def multi_list(ar)
  return [] if ar.empty?
  num = ar.pop
  multi_list(ar) << num * 2
end

multi_list([1, 2, 3, 4])   #=>[2, 4, 6, 8]

元の方がいいですかね。なお、変数 num は省略できません。num * 2 の num のところに ar.pop を入れると、期待した動作にならず、SystemStackError が出ます。pop が先にされないのですね。それから、返り値を与える演算は << です。
※追記
それにしても再帰は技巧的すぎる気もするな。map を使わないなら、

def multi_list(ar)
  t = []
  ar.each {|x| t << x * 2}
  t
end

multi_list([1, 2, 3, 4])   #=>[2, 4, 6, 8]

くらいか。まあ、再帰のは遊びなのでしょうけれども。それから、Rubyオープンクラスなので、map を別に実装してしまうという手もあるが。例えばこんな風。まあ、既に map があるので意味はないけれど。

class Array
  def tmap
    t = []
    each {|x| t << yield(x)}
    t
  end
end

[1, 2, 3, 4].tmap {|x| x * 2}    #=>[2, 4, 6, 8]


今日で仕事は一段落。夜は打ち上げみたいなもの。明日の朝は寝られるけれど、またギャングどもが来るし。