Perl 6のRosettacode: Wireworldがエラーになる件

13 views
Skip to first unread message

jscripter

unread,
Feb 28, 2016, 3:44:41 AM2/28/16
to TSNET
毎度です。下記のコードを

Wireworld | Perl 6 RosettaCode tasks

wireworld3.p6にUTF8で保存して、

rakudo-star-2016.01-x86_64 (JIT).msi

をWindows 10 Proにインストールして、

c:\Scripts\perl6>perl6-m -v
This is Rakudo version 2016.01.1 built on MoarVM version 2016.01
implementing Perl 6.c.

を実行すると、

c:\Scripts\perl6>perl6-m wireworld3.p6
Index out of range. Is: 2, should be in 0..0
  in block  at wireworld3.p6 line 23
  in method succ at wireworld3.p6 line 21
  in block <unit> at wireworld3.p6 line 44

Actually thrown at:
  in code  at wireworld3.p6 line 24
  in method succ at wireworld3.p6 line 22
  in block <unit> at wireworld3.p6 line 44

のようなエラーになります。

どこが問題なのでしょうか。わかる方がいらっしゃればお教えください。



jscripter

unread,
Feb 28, 2016, 3:56:40 AM2/28/16
to TSNET
下記のクリスマスバージョンのMacにおける状態とまったく変わっていないことを確認しました。Perl 6のコードを読めるように勉強中ですが、なかなか大変・・・

12/28/2015: [Perl 6] Resetta Code:Perl 6
http://text.world.coocan.jp/renewal_2015_12.html#perl6_1451305123

2016年2月28日日曜日 17時44分41秒 UTC+9 jscripter:

Zazel

unread,
Feb 29, 2016, 9:52:58 AM2/29/16
to tsnet_...@googlegroups.com
Zazelです。

On 2016/02/28 17:44, jscripter wrote:
> Wireworld | Perl 6 RosettaCode tasks
> https://trizen.gitbooks.io/perl6-rosettacode/content/programming_tasks/W/Wireworld.html

12, 13行目のフレンチダブルクォート(?)が閉じてない文法を知らないので、
解読できません。(^_^;)

# というか、{入力文字列 and 出力文字列 and 置換}の意図もわからない。

jscripter

unread,
Feb 29, 2016, 4:55:02 PM2/29/16
to TSNET

コメントありがとうございます。今夜考えてみます。

2016/02/29 23:53 "Zazel" <zaz...@gmail.com>:
--
このメールは Google グループのグループ「TSNET」の登録者に送られています。
このグループから退会し、グループからのメールの配信を停止するには tsnet_member...@googlegroups.com にメールを送信してください。
その他のオプションについては、https://groups.google.com/d/optout にアクセスしてください。

jscripter

unread,
Mar 1, 2016, 6:05:26 AM3/1/16
to TSNET
Wireworldのやっている意味はRosetta Code自体のページを見ないとよくわかりませんね。

Wireworld - Rosetta Code

«+«の«はHyper Operatorと呼ばれていて、

Operators

にあります。結局、この場合、$iや$jに(-1, 0, 1)のリストをそれぞれ+演算して、新しいリストが作られることになります。«の矢印の方向がリストを作用させる方向を示していることになるようです。

any()のメソッドの意味は、

Documentation for method any

にあります。

@.lineが結局問題ですが、これがTwigilというものになります。

Variables

Twigilが僕もまだよくわかっていないのですが^^;)

ということで、いろいろとRosetta Codeを試しているのですが、実際、エラーになるものが大変多いのです。これが問題になっていないこと自体がよくわからないので、僕自身が何か変なところで間違っているのではと自分自身の操作など単純ミスを疑っていたのですが、Macでも同じ現象が起きていたので、質問してみたのです。


2016年2月29日 23:52 Zazel <zaz...@gmail.com>:
--
このメールは Google グループのグループ「TSNET」の登録者に送られています。

jscripter

unread,
Mar 1, 2016, 6:23:20 AM3/1/16
to TSNET
Twigilを理解するためには

Object Orientation

を研究するのが必須みたいな感じです。


2016年3月1日 20:05 jscripter <jscri...@gmail.com>:

jscripter

unread,
Mar 1, 2016, 6:52:27 AM3/1/16
to TSNET
もう一つ忘れていました。

Operators

prefixの「^」はupto operatorです。

うむ、変なことになっているね。

say ^5;

の出力が

^5

になります。

for ^5 { say "1" }


1
1
1
1
1

となりますけど・・・

say 0..^5;

の出力も

^5

となる。

2016年3月1日 20:23 jscripter <jscri...@gmail.com>:

Zazel

unread,
Mar 2, 2016, 7:13:01 AM3/2/16
to tsnet_...@googlegroups.com
Zazelです。

なるほどライフゲームですね。
http://rosettacode.org/wiki/Conway's_Game_of_Life

で、フレンチダブルクォートよりギュメと呼ぶのがよさそうですが、
http://doc.perl6.org/language/operators#postcircumfix_%C2%AB_%C2%BB
こちらしか知りませんでした。

# <<+<< で代用できるのでASCII外の文字を使う必要ないのに……。

On 2016/03/01 20:52, jscripter wrote:
> say ^5;
> の出力が
> ^5
> になります。

イテレータなので、say ^5 .join("\n") などで出力できます。

jscripter

unread,
Mar 2, 2016, 7:51:39 AM3/2/16
to TSNET
ありがとうございます。

say ^5;# はサンプルになっていないということですね。

for ^5 { }# も不完全。

for ^5 { say $_ }

を試すと、Perl 5のDNAが少し残っていたのでホッとしました。まあ、意味があると言えるかどうかは問題ですが・・・


2016年3月2日 21:13 Zazel <zaz...@gmail.com>:

jscripter

unread,
Mar 2, 2016, 8:47:26 AM3/2/16
to TSNET
for ^5 { .say };

.say for ^5;

でも同じ結果が得られる。$_は省略されたと見做される。


2016年3月2日 21:51 jscripter <jscri...@gmail.com>:

Zazel

unread,
Mar 2, 2016, 8:58:33 AM3/2/16
to tsnet_...@googlegroups.com
On 2016/03/02 22:47, jscripter wrote:
> for ^5 { .say };
> .say for ^5;
> でも同じ結果が得られる。$_は省略されたと見做される。

Perlなので、(^5)>>.say などなど書き方はいっぱいあります。

Perl5で互換性を保つために変にOO化したのを、Perl6で互換性を捨てたら
さらに混迷を深めた印象です。演算子多過ぎ。

jscripter

unread,
Mar 2, 2016, 9:16:09 AM3/2/16
to TSNET
まあ、元々Perlはこう書いたら動くだろうと書けば、大体動くのがいいところだったと思うのですが、Perl 6はエラーがいろいろと出てくるし、予想外の動きになったりするのが問題ですね。

Programming Perl 6を書くのは演算子も多いし、分量が多くなって大変だろうなと思いますけど、しっかり哲学・思想を書いてほしいです。なぜこんな仕様にしたのか。こういう風な物の見方・考え方で書けば大体動くよと。

おそらく、OOに一貫性の秘密があるのだと思っているのですが・・・ここをまず押さえることが重要なような気がしています。OOはPerl 5と大きく違うところですね。TwigilもOOと深く関係しているというか、そのものというか・・・要はパフォーマンスを上げることと関係があるのだろうと思っているのですが・・・

2016年3月2日 22:58 Zazel <zaz...@gmail.com>:

Zazel

unread,
Mar 3, 2016, 7:32:16 AM3/3/16
to tsnet_...@googlegroups.com
perl6の方針で括弧を減らすというのはどこかで読んだ気がします。

それはさておき、今のところ見つけた問題は2つ。

1つめは2箇所のfor文に括弧が足りない。
gather for @i X @j -> (\i, \j) {
のようにしないといけない。

2つめは postcircumfix:<[ ]> のところで、処理内容はわかるけど、
どう修正すればいいかは経験値が足りなくて簡潔に提示できないです。
添字の時に分解してからリストで返したいのだろうけど……。
こちらがエラーが出る直接の原因だと思います。

jscripter

unread,
Mar 3, 2016, 9:53:45 AM3/3/16
to TSNET
ありがとうございます。私ももう少し調べてみます。こういう風に質問すると自分でも真剣になって考えるので少しずつ理解が進みます。

2016年3月3日 21:32 Zazel <zaz...@gmail.com>:
Reply all
Reply to author
Forward
0 new messages