晴。
早起き。
音楽を聴く。■バッハ:無伴奏フルートのためのパルティータBWV1031(ラインハルト・ゲーベル、ムジカ・アンティクヮ・ケルン、参照)。■モーツァルト:クラリネット協奏曲K.622(デイヴィッド・シフリン、ジェラード・シュワルツ)。バセット・クラリネットを使っている由。
Mozart: Clarinet Concerto; Clarinet Quintet
- アーティスト: Wolfgang Amadeus Mozart,Gerard Schwarz,Mostly Mozart Orchestra,David Shifrin
- 出版社/メーカー: Delos Records
- 発売日: 1992/12/11
- メディア: CD
- 購入: 1人
- この商品を含むブログ (2件) を見る
早朝出勤。早起きしたせいであろう、午前中ものすごく眠たくて閉口する。アホだな。
#
図書館から借りてきた、佐々木幹郎『パステルナークの白い家』読了。何の気なしに図書館の棚から抜いてきたものである。初めて読む著者で、最初は端正な文章の、毒にも薬にもならない詩人のエッセイかと思ったのだが、すぐに自分の愚かさに気づいた。それにしても、本物というのはどこで出くわすか、わかったものではない。普通に上手い文章もあるし、現実を題材にしているというだけで、優れた短編小説のようにあざやかな印象を与えられたものも少なくなかった。あまり分析的に語る気が起きないが、このような端正な文章で、深い情感を内に込めるのは容易なことではない筈である。繰り返すけれど、これは毒にも薬にもならない文章と紙一重なのだが、その紙一重が天と地ほどにもちがうのだ。や、いい書き手と巡り会いました。しかし、著者のことは殆ど無知だった。どういうものだろうか。
- 作者: 佐々木幹郎
- 出版社/メーカー: 書肆山田
- 発売日: 2003/09
- メディア: 単行本
- この商品を含むブログを見る
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]
#
今日で仕事は一段落。夜は打ち上げみたいなもの。明日の朝は寝られるけれど、またギャングどもが来るし。