2つの論理和演算子の優先順位について(|| と or)

なんとなく、はてなにメモするのがいいかなと思ったので、今日確認したことを。コメントに書いた説明が正確かどうか不安もあるけど。

今回わかったことは

...
sub property {
  my $self = shift;
  $self->{'_arg'} = shift || return $self->{'_arg'};
}
...

で set/get みたいな効果になるけど、このまま || を or に変えるとうまくいかないということ(実際は shift する/した値の内容もチェックしたほうがいいかも)。「制御構造には || でなく or を使う」と単純に理解していたので少し理解に苦しんだものの、代入演算子 = に対する両者の優先度の違いを確認してなんとか飲み込めた。

test_perlop.pl*1

{
    package test_perlop; use strict; use warnings;

    # or は = より優先度が低く、
    # || は = より優先度が高いことを確認する。
    my $undef = undef; my $str = 'str';
    my $v1; $v1 = $undef || $str;
    my $v2; $v2 = $undef or $v2 = $str;
    printf " \$v1 = %s\n", $v1;
    printf " \$v2 = %s\n", $v2;

    # or の場合:
    # $arg=shift が評価された後に return $arg が評価されるので
    # $arg には shift された undef が代入され、それが返される。
    sub hoge { my $arg = 'hoge'; $arg = shift or return $arg; }

    # || の場合:
    # $arg = shift が評価される前に shift || return ... が評価される、
    # すなわち shift が偽となると即 return $arg が評価され
    # shift からの代入は行われないので $arg の内容は 'foo' のまま返される。
    sub foo { my $arg = 'foo'; $arg = shift || return $arg; }

    printf " \$hoge = %s\n", &hoge; # (1)
    printf " \$foo  = %s\n", &foo;

    my $op = PerlOp->new;
    printf " \$op->foo = %s\n", $op->foo; # (2)
    printf " \$op->bar = %s\n", $op->bar;
}
{
    package PerlOp; use strict; use warnings;
    sub new { my $pkg = shift; bless{foo => 'foo', bar => 'bar'}, $pkg; }
    sub foo { my $self = shift; $self->{foo} = shift or return $self->{foo}; }
    sub bar { my $self = shift; $self->{bar} = shift || return $self->{bar}; }
    1;
}
__END__

=pod

出力 (ActivePerl v5.8.8 で確認) :
> perl test_perlop.pl
 $v1 = str
 $v2 = str
Use of uninitialized value in printf at test_perlop.pl line 23.
 $hoge = 
 $foo  = foo
Use of uninitialized value in printf at test_perlop.pl line 27.
 $op->foo = 
 $op->bar = bar

(1) と (2) の位置で Use of uninitialized value... と警告される

=cut

*1:行数節約スタイル。普段はこんな書き方しません。

はてなWordLinkを使ってみた

はてなに書くべきネタなのでひさびさ更新。

今さらながらはてなWordLinkベータテストを知って、使ってみたところ、基本的にとても面白いと思うんですが、ひとつ問題に突き当たりました。

http://wordlink.hatelabo.jp/cu39/

自分の頭の中はどうなってるかなーと思いつつ抽象概念をぽつぽつ並べていったら、はてなWordLink サービス終了のお知らせというキーワードが出来た。書いてる時点の状態をメモしておくと下のようになってます。

善 暴力

善と悪は対立概念という意味で含めていて、暴力は類似/下位概念という意味で含めているわけですが、パッとこれだけ見ると「悪=善=暴力」とか「善=暴力」という解釈もできる並びに。

というか、おそらくd:id:wanparkさんは、近接/重複/包含/類似関係にある言葉をつなげる使い方を想定して作っているんだろうなぁと思いました。上記のような問題を回避するためには、色分けとか、関係性を示す言葉や記号を添えるとか、何らかの機能付加で解決することはできるだろうけど、現在の簡潔さは失われてしまうしなぁ。でもWordLinkの豊かさを求めるなら対立関係も含めていかれるほうがよい気はするし、「関係」ということを考えたら対立もまた関係であるわけだし。むむむ。

とりあえず対立は排除せず、近接/重複/包含/類似と混在で使おうとは思いますが。

面白かったのは、各ユーザのトップページに、ワードが編集した順に並んでいくところ。無意識にいじってたら

悪 不正 本能 欲求 自然 性

とか並んでしまって、意識してそう思うことは少ないけど性を悪だと思ってる部分があるのかなぁと思ってみたり。しかし「無意識に」というのはポイントで、本当にまったく関連性を想定していないものの間に他人が妙な邪推をはさむ余地が生じるのもいやだなぁと思う部分もあります。まぁワードの並び方ひとつが根拠として強力になるかといえば、そんなこともないかもしれませんが。

塚本邦雄、死去

今生と根性と紺逭の差のさもあらばあれ人燒けば灰

『約翰傳僞書』より。

全集、短歌ぶんだけだと4万円か……東京堂書店のサイン入り初版(全巻+別巻)は売れてしまうかなぁ。

『猫、1・2・3・4』オンライン版

(元)歌人・中山明の、1984年に刊行された第一歌集がオンライン版として公開されました。現在、「翡翠通信(かわせみつうしん)」トップページからリンクされています。

あるいは愛の詞(ことば)かしれず篆刻のそこだけにかすれゐたる墓碑銘

という有名な歌はこの歌集の最後に収められているものです。今夜ゆっくり読もうと思います。

はてなRSS

使ってみていますが、非常に使いやすい。特に気に入っているのが、記事全文をCDATAとしてRSSに入れている場合は「もっと読む」ボタンを押すとそのまま読めてしまうところで、この日記とか本家などは本URLで読むよりも読みやすくなっていたりする。PVを稼ぎたい人は全文を入れたくないところだろうけど、気にしない人は積極的に入れていってほしいかんじです。

RSS配信しているページに関してはRSSリーダーに入れてしまい、アンテナにはそれ以外のページを登録するといった風に役割分担してしまってもいいかもしれませんね。そうなるとアンテナは有料オプションつけなくてもいいかも……などと考え初めてしまってますが、自らの収入減の可能性をも厭わず積極的にサービスを提供していくあたりがはてならしい。