【Perl6】謎の角カッコは「あいまいさ解決」のカッコだった
前の記事で書いたように、下の例がうまくいくのに、
なぜうまくいくのかが分からなかった。
# 変数 $str の前に 'abc' を追加する $str [R~]= 'abc';
この角カッコは文法的にどんな意味があるのか分からなかったが、
ちょっと調べたらちゃんとPerl6の公式ドキュメント(英語)に書いてあった。
Nesting of Meta Operators
To avoid ambiguity when chaining meta operators use square brackets to help the compiler to understand you.
my @a = 1,2,3; my @b = 5,6,7; @a X[+=] @b; say @a; # [19 20 21]
(訳)
メタ演算子のネスト
メタ演算子がつながっている場合には、角カッコを使うことであいまいさをなくし、コンパイラにあなたの意図を伝えることができます。
実は「~=」の「=」もメタ演算子の一種で、中置演算子「~」に作用している。
よって、
$str R~= 'abc';
は、「R」と「=」の2つのメタ演算子が連結している状態になる。
ここで、間に挟まれている「~」がどちらにくっつくのかはっきりさせるのには、
$str [R~]= 'abc';
や、
$str R[~=] 'abc';
のように角カッコで明示的に指定する。
ちなみに、角カッコなしの場合はどうなるかというと・・・後者に解釈される。
(こういうのをいちいち覚えなくてよいように角カッコを使うわけ。)
謎が解けてすっきりした。
実はこの角カッコ、いろいろ面白い性質があるのを見つけた。
これも時間ができたらまた書きたい。
書かないと忘れる。
【Perl6】文字列を変数の『前に』追加する
少し試行錯誤して見つけたので、メモしておく。
先に結論を書いておく:
=========================================
Perl6では、
# 変数 $strの『前に』文字列 'abc' を追加する $str = 'abc' ~ $str;
を、
$str [R~]= 'abc';
と書くことができる。
=========================================
以下に試行錯誤の過程を書く。
ある変数に数を足したり、文字列を追加したりという処理はよくあるので、
Perlに限らず、さまざまなプログラミング言語で省略記法が用意されている。
Perl5の場合はこう:
# 加算 $num = $num + 1; # 省略記法 $num += 1; # 文字列の連結 $str = $str . 'abc'; # 省略記法 $str .= 'abc';
これは特に、変数の名前が長かったリ、複雑なデータ構造だったりするときに役に立つ:
$very_very_long_name_variable[42]{'xyz'}[3] .= 'abc'; # こうは書きたくない・・・ $very_very_long_name_variable[42]{'xyz'}[3] = $very_very_long_name_variable[42]{'xyz'}[3] . 'abc';
ところが、これらの省略記法は変数の『後ろに』追加する場合にしか使えない。
つまり、
$long_name_variable = 'abc' . $long_name_variable;
に対する省略記法がないのである。
Perl5 だけでなく、他のプログラミング言語にもない(と思う)。
こういうのを書かなきゃいけなくなるたびに、何とかならないものかと思っていた。
さて、Perl6には「Rメタ演算子」というものがある。
「メタ演算子」とは「演算子に対して作用する演算子」という意味。
Rは「Reverse」の略で、ある演算の左項と右項を入れ替える。
例を見た方が早い:
$str = 'a' R~ 'b'; # Perl6では文字列連結は「~」を使う # ==> 'b' ~ 'a'; # ==> 'ba'
これを使えば、文字列を変数の『前に』追加できるんじゃないか?
と、思って試行錯誤を開始。
my $str = 'a'; $str = $str R~ 'b'; # ==> 'ba'
いい感じ。
これをさらに進めて、
$str R~= 'b';
でいけるかと思ったら、これはエラーになる。
$str R~= 'b'; # ==> 'b' ~= $str;
と解釈されてしまうため。
Rメタ演算子が、「~=」に対して作用してしまっている。
これを何とか「R~」と「=」だと認識させる方法はないだろうか、
数学ならカッコを使うところだけど・・・
と考えて、最後に思いついたのがこの方法:
$str [R~]= 'b' # ==> 'ba';
見事成功。
・・・とここまで書いて、次にこの角カッコは何かというのを説明しようとしたのだけど、
よく考えると、これでなんでうまく行くのか分からなくなってきた。
$str [R~]= 'b' # ==> $str = $str [R~] 'b';
っていうことなんだけど、
あれ?角カッコを中置するとどういう意味になるんだっけ??
ということで、だれかがここまで読んでくれていたら申し訳ないのだけど、
いつか時間ができたらまた書く。
なんと、「Perl6入門」の翻訳がかぶった・・・!!!
一時的な情熱にかられて作った例の「Perl6入門」のサイトだったが、たまーーーに見に来てくれる人がいるらしい。
今日試しに「Perl6 入門」でググってみると3件目にこのブログの記事
Perl6入門「Perl 6 Introduction」を翻訳したら意外と大変だった - 公開型メモ帳
が表示されるようになっていた。
自分が作った「Perl6入門」のサイト
Perl6入門
そのものは完全に圏外なので、おそらくブログ記事からたどって来てくれているんだろうな、ネットワークっておもしろいな~~
・・・なんて悠長なことを考えながらその下を見ていったら、
なんと8件目にこんなサイトを発見。
Perl6入門
一瞬、ついに自分のサイトが表示されるようになったのか?!
と思ったら、なんと別の人が作ったサイトだった・・・
ようするに、同じオリジナルサイト「Perl 6 Introduction」を翻訳した人がいて、
日本語タイトルもそのまま「Perl6入門」で同じ、
オリジナルサイトのCSSを利用しているから見た目も全く同じ、
という、瓜二つのサイトができてしまったわけ。
キャッシュの日付を見るかぎり、おそらく最近アップロードされたサイトなんじゃないかと思うけれど、
このサイトを作った人もいまごろ気づいて「あ~~~~~~っ」ってなってるんじゃないだろうか。
Itsuki Toyota さんという方らしいけれど、
翻訳も丁寧だし、
サイトに広告も貼付けてないし、(ぼくのサイトと違って・・・)
純粋にPerl6の発展のためにやりました!
っていう感じがにじみ出ていて、少しだけ申し訳ない気持ちがしてくる・・・
(いや、ぼくも別に広告貼りたくてやったわけじゃないけどさ・・・)
もちろん、それぞれ独立して翻訳した文章なので、多少の翻訳の違いはある。
すこし比べてみてみると、あちこちに微妙な違いがあって面白い。
同じ文章を翻訳したっていうだけで、勝手に親近感を持ってしまった。
一番大きな違いは、
- Itukiさんのサイトは全部を1ページにまとめてある(オリジナルサイトと同じ)
- ぼくのサイトは章ごとに分けてある
というところ。
状況によって使い分けるのがいいんじゃないかと思う。
(とはいえ、ぼくの方のサイトはまだ圏外だけど)
Perl6入門「Perl 6 Introduction」を翻訳したら意外と大変だった
Perl6の人気がなかなか出ない。
日本語で読める資料が少ないからじゃないかと思って、英語の資料をひとつ翻訳してみた。
元の文章はこちら:
で、翻訳後のサイトがこちら:
この文章を選んだのは、自分で読んだ時に、簡単に翻訳できそうだと思ったから。
ところが、実際に翻訳してみると、予想以上に時間がかかってしまった。自分で読んで理解するのと、他の人に通じるように日本語に変換するのとでは、かなり大きな差があるようだ。
ひとつ勉強になった。
せっかく翻訳したので、できるだけ多くの人に見てもらいたい。しかし、翻訳しましたという話をどうやって広めればいいのか分からない。放っておけばそのうち広がるものだろうか?
とっさの中国語講座 「車に注意!」
外国で生活していると、言葉が通じるかどうかが生死を分けることもある。
ということで、今後中国に行く予定だったり、住む予定だったりする人のために、「とっさの場面で使う中国語」をひとつ紹介してみる不定期開催企画、その名も『とっさの中国語』。
第一回目のフレーズは、「車に注意!」。
続きを読む中国のユニクロと日本のユニクロ
実は今、日本に帰ってきている。
ユニクロが元旦からセールをしていたので、午前中から行ってきた。
毎週のようにセールをしているユニクロのことだから、元旦もそれほど変わらないんだろうと思ってたのが、意外と本気の初売りセールだった。半額の商品を数点買って帰ってきた。
年末に帰ってきてよかった。
中国でも増えてきているユニクロ
xyzzyとEmacsでPerlを外部フィルタとして使う
いつも忘れて調べなおす羽目になるので、自分用にメモしておく。
シンタックスハイライトも使えるようになったし、その練習も兼ねて。
外部フィルタコマンド(と勝手に呼んでいる)を使う方法
Emacsにも、xyzzyにも、選択済みリージョンを外部コマンドに渡してその結果で置き換える機能がある。リージョンを選択後、
Emacsでは、