公開型メモ帳

ますます激しくなる物忘れへの対策

【Perl6】謎の角カッコは「あいまいさ解決」のカッコだった

前の記事で書いたように、下の例がうまくいくのに、
なぜうまくいくのかが分からなかった。

# 変数 $str の前に 'abc' を追加する
$str [R~]= 'abc';


この角カッコは文法的にどんな意味があるのか分からなかったが、
ちょっと調べたらちゃんとPerl6の公式ドキュメント(英語)に書いてあった。

Operators

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では、

続きを読む