おもしろく生きたいね

2007年5月の記事一覧

 少し反応をいただいたので追記。

 木村さんの「‘=>’の右辺にあるからリストコンテキストになるというのはちょっと違うような気がします。」について。実装の話ではなくあるべき仕様の話をしています。lexerの段階でカンマとしてpushしてしまい、二項演算として左右のオペランドの結合を保存しないのであれば、list contextになるのは道理ですね。実装から見て、さほど練られた仕様ではなさそうだということはわかりました。ありがとうございます。

 みすらんさんの「そんなときにはscalarを使えばいいと思う。=>にスカラーコンテキスト提供されたりしたらリスト演算子で使えなくなって不便、とか。」(リンク先はいずれ流れて消えちゃうみたいです)について。リスト演算子はカンマがあるのでいいんじゃないでしょうか。二重矢印を使うからには、左にあるものと右にあるものの関連を示唆しているはずですが、解釈がそれを逸脱するのはいただけないと思います。

 そうそう、二重矢印の右に配列を置く例に思い当たった。「$obj->send(some_method => @arguments)」みたいな書き方はたまに見る。メソッド名はちゃんと引用符で括って、二重矢印でなくカンマを置けばいいのに、こういう書き方が好きなPerlプログラマは多いみたい。しかし、二重矢印で書くなら右はarrayrefの方がふさわしいんじゃないかと思う。

 文法や仕様でなく、挙動や実装の方に寄りかかる習慣が常態化しているのは気持ち悪い。でも、裏をかくのが楽しいのは事実。Perl5が出たとき、危なっかしいギミック満載でドキドキしたのを思い出す。13年も前か、と言いかけて、あれ、たったの13年前か、と思った。この世界は進むのが速い分、振り返ると実時間は大して経っていないんだな。


 Perlは文法上、(右)二重矢印「=>」をカンマ「,」と同義としている。カンマとの違いとして、二重矢印の左オペランドにbare wordを置くと文字列化される。これによって、ハッシュなど二つの値の組を書いたときにそれっぽく見える。

 そこに、罠がある。常識で考えて二重矢印の右オペランドはscalar contextだろう…と思いきや、なんとlist (array) contextなのだ。次のようなコード断片を考える。

  my $conn = Client->connect(server   => $config->server,
                             username => $username,
                             password => $password,
                             timeout  => 30);

 単体で見れば、まったく問題なさそうに見える。しかし、$configserverメソッドが気を利かせて、scalar contextならプライマリサーバの単値、list contextなら全サーバの配列を返す、のようなことをしてくれた瞬間、破綻してしまう。たとえば、$configが要素二つの配列を返すと、connect()メソッドに渡す引数列は('server', 'host1', 'host2', 'username', 'someone', 'password', 'something', 'timeout', 30)のようになり、これをハッシュで受ければ('server' => 'host1', 'host2' => 'username', 'someone' => 'password', 'something' => 'timeout', 30 => undef)となってひどいことになる。また、取得できないときに空の値(undef'')でなく空配列(())を返すような実装になっていても同様だ。

 Perl5のbare wordやcontextに関してはいろいろ疑問を持っていて、いちばん痛い例(文法エラーにも型エラーにもならず、例えば上の例では奇数個の配列が返るときなど顕在化すらしない)がこれなのだが、Larry Wallがその「人間の意図をできるだけ理解して動く」という哲学を徹底するのなら、二重矢印の右側はscalar contextにすべきだった。ここでリスト展開されてうれしいケースはちょっと思いつかない。

 今さらPerl5の文法仕様が変わることはないので、せいぜい注意しよう。さすがにPerl6では、contextの概念が変わったり、二重矢印がPairを生成したり、配列がオブジェクトになったりしているので同じ問題は存在しない。別のひずみがある気がするが、それはいずれ。


 夜も更け、無性に打ちたい気分になったので新宿へ遠征。風速0.5の店で朝まで遊んだ。ブランクを経て再開後は、再構築したセオリーに沿って打つ中でなかなかブレイクスルーがなく、二着三着ばかりのゲーム代負けが続いていた。

 しかし、今日はいろいろうまく行って前日に続く連勝。昨日、ひさしぶりに役満をあがったことと、それですぐに引き上げたことで、二重に落ち着きを得たのかも。しかしまあ、睡眠と栄養と時の運と思っておくのが無難だろうね。ただ、オリと喰い仕掛けの閾値を下げ、決断を早めるようにしたことは成績に寄与したと思う。


 昨日は麻婆豆腐を食べ損ねたので點(とむす)か希須林小澤に行こうと思ったが、時間が遅すぎて閉まっていた。むー。まあ、せっかく歩いてきたのでフレッシュネスバーガーに入ることにした。

 クラシックチリチーズバーガーという新作と、ベーコンオムレツバーガーと、スイートポテトのフライと、チャイを注文。新作はなかなかうまい。ベーコンオムレツやサツマイモのフライはほかにはあまりないので、ひさしぶりにフレッシュネスバーガーを堪能したという感じ。チャイはもうちょっとスパイスに工夫がほしい気もしたが、ハンバーガーのお供なのでこのくらいか。

 阿佐ヶ谷はモス、フレッシュネス、ヴィレヴァンダイナーとそろっているのが便利。そのときの気分に従って使い分けています。


 SoftBank 911TとSony DR-BT21Gの組合せでハンズフリー通話がうまくできていなかったのだが、解決した。911T側の登録デバイスをいったんすべて消して再度DR-BT21Gを登録し、911T側から「接続」してみたら、以降はちゃんとA2DPとHFPで同時接続されるようになった。

 同時接続していることは、DR-BT21Gのマニュアルにある通り、LEDの点滅パターンで分かる。今まではA2DPのみだったので、ぴかぴか、と点滅の間隔が短かったが、同時接続時は青がぴか、ぴか、とゆっくり二度点滅してしばらく休み、を繰り返す。また、着信音ピコーン、ピコーンからピョロロロロ、に変わった。

 音楽再生中も問題なく着信できるし、発信もできる。これは快適だ。でも、ヘッドホンだけで会話していると不審がられそうなので、右手で着信ボタンを押したらそのままヘッドホンに添え、左手を口に当てて通話してますよポーズを取ることにしたよ。


 Perlは配列とリストを区別しているが、これが時に罠になる。

 次のスクリプトが、何を表示するか予想できるだろうか。

#!/usr/bin/perl
sub f {
    return ('a','b','c','d');
}
my $count = scalar(f());
warn $count;

関数が配列を返して、その要素数を取っているのだから「4」かな…と思いきや、答えは「d」。なんで?

 まず、関数f配列を返さない。返すのはリストである。括弧にだまされそうになるが、return文における括弧はC同様に意味を持たない。括弧を外しても結果は同じなのは試してみれば分かる。というか、括弧を付けても配列になるわけではなかった。returnを除いても、括弧を二重にしても同じ。配列に代入して初めて配列になる。(追記しました)

 次に、リストをscalar contextで評価すると、要素数ではなく末尾の要素を返す。意図的な挙動なのかは不明だが、スタック構造上そうなるだけかもしれない。

 いずれにしても、リストを返すような実装ははまるので避け、明示的に配列を生成して返した方がいいだろう。あるいはwantarrayを見て、偽ならば次のような値を返すように関数を書けば便利かもしれない。

  • イテレータやハンドル
  • 最初の要素
  • 配列のリファレンス
  • 要素数

 リストをfirst class objectとして扱えないにも関わらず、こんなところで配列との区別を意識しないといけないのは欠陥のようにも思えるが、どうだろう。

 また、contextの罠もはまるとなかなかに痛いので、それはまた別途書くことにする。


 CDのリマスター版を聴いたりして、思う。確かに音はいいし、ミュージシャンが世に出したかった本来の音はこっちなのだろう。技術や資金や人材の問題でできなかったことが、今は可能になったわけだから、感慨深いだろう。でも、受け手からするとやっぱり、当時聴いた音への愛着は深い。荒んだ心にスッと染み入った、チープでワイルドな音。時代の勢いが、空気が、傷だらけになったLPに、CDに、当時の自分の思いとともに封じ込められている。

 それでも、リマスター版を手に入れてしまったら、肥えた耳はやっぱりそちらを選んでしまうかもしれない。エンコードしてファイルにしてしまえば、便利さに負けて原盤への執着も薄れるだろう。原盤を手放せば、古い音への執着も薄れ、いずれ新しい音で上書きされる。そして古い音を聴くことはもうなくなるかもしれない。

 最近、デジタル化以後の経験や記憶の希薄さにはっとすることがある。情報の量は増えたし効率も密度も高まったが、とにかく体感や実感が希薄だ。行動は最適化され、知識は増えた。すべてが建設的に、効率的に、積み重なっていく。しかし、真に鮮烈な私的体験はどこへ消えたのか。日々のニュースや話題は共有され、誰との会話も似たようなもの。みんなニコニコして、よく狂わないでいられる。

 自分の興味が、先端にも向かいつつ、泥沼のような深みにも伸びていくのは、やはりそうした慢性的倦怠感からだろうか。五月の生暖かい風を頬に受けながら、キラキラとした未来への希望と同じくらいに美しい懐かしさを感じてしまう俺は、先端に生きるには狂気が足りないのかもしれない。


 今日はヘルシー系にしようと思って、五穀米・雑穀米が食べられるランチ処を探したけど、なかなか近場になかったので玄米ご飯で手を打った。看板が地味なせいで、今までぜんぜん存在に気づかなかった「JYU」。

 ビントロ刺身、ほっけ焼き、豚肩ロースの三種盛に、玄米ご飯の特盛。特盛という割には2倍弱くらいだったので拍子抜けしたが、でもちょうどよかった。やっぱり野菜と魚が多い方が落ち着く。950円と、値段もいいところだと思う。二種盛なら680円とリーズナブル。持ち帰りの弁当もやっているらしい。なかなかおすすめです。


 昨日、睡眠改善薬を買ったんだけど、眠れなかったら飲めばいいやと思ったら気楽になって、すんなり眠れた。こういうのもプラシーボ効果の一種だろうか。

 それでも、朝起きたらかなり熱っぽかったので、大事を取って仕事は休んだ。やはり肉は消化が悪いようで、あまり腹は減っていない。洗濯をしたりして、グレープフルーツジュースを飲んで再び就寝。夜まで寝た。熱が軽い頭痛に変わったのが気になるが、また今夜眠れば治るだろう。


窒息鳩盛り合わせと岩手産和牛のサガリ
短角牛の芯ロース

 さて、ここからが本番。目当ての窒息鳩の盛り合わせ、岩手山和牛のサガリ、短角牛の芯ロースと三皿が到着。

 サガリって初めてだけど、横隔膜(ハラミ)からぶら下がった部位なんだね。なじみあるハラミよりもやわらかいけど、適度な歯ごたえはあっておいしい。

 短角牛の芯ロースはこれぞ正肉の貫禄。脂は少ないがジューシー。ということは、まさに肉汁を味わっているということか。やっぱりハラミやカルビばっかり食っていたのではいけないね。

窒息鳩の正肉
窒息鳩の骨付き肉

 そして、いよいよ窒息鳩です。すばらしい血色と濃厚な血の香りに食欲が掻き立てられる。それを塩胡椒だけで、目の前で焼いて食べるという贅沢!正肉、骨付き肉、ハツ、レバー、砂肝とまるまる一羽の各部位を楽しめます。正肉のぷりぷりの食感、きめ細かな肉質、芳醇な味わい。骨の際もおいしいし、モツも粗さがまったくない完成品。レモンもいいがタレとの相性も捨てがたい。ビールもいいが、赤ワインでいただきました。

 この鳩は今回限りの触れ込みだったが、後日レギュラー化するとの話を聞いた。フランスの品種を茨城で育てているのだそうだ。このクオリティが安定供給されるとはすごいね。