=encoding euc-jp =pod =head1 名前 Acme::Brainfuck - perlコードに埋め込まれたBrainfuck =head1 概要 #!/usr/bin/env perl use Acme::Brainfuck; print 'Hello world!', chr ++++++++++. ; =head1 説明 Brainfuck is about the tiniest Turing-complete programming language you can get. A language is Turing-complete if it can model the operations of a Turing machine--an abstract model of a computer defined by the British mathematician Alan Turing in 1936. A Turing machine consists only of an endless sequence of memory cells and a pointer to one particular memory cell. Yet it is theoretically capable of performing any computation. With this module, you can embed Brainfuck instructions delimited by whitespace into your perl code. It will be translated into Perl as parsed. Brainfuck has just just 8 instructions (well more in this implementation, see L below.) which are as follows Brainfuckは、入手可能な最も小さいチューリング完全プログラム言語に関連する。 ある言語がチューリングマシン --1936年、英国の数学者Alan Turingによって 定義されたコンピュータの抽象モデル-- の操作をモデル化できる場合、この 言語はチューリング完全であるという。チューリングマシンは、無限に続く メモリセルの連なりと、ある一つのメモリセルを示すポインタだけから構成される。 しかしこのマシンは、どんなコンピュータ計算の実行も理論的には可能である。 このモジュールを使えば、あなたのperlコードの中に、空白で区切られた Brainfuck命令を埋め込める。それはパースされてPerlに翻訳される。 Brainfuckは、たった8個の命令を持つだけなのだ(この命令より多くのことに ついては後述のLを参照のこと)。 それは以下の如し。 =head2 命令 =over 4 =item + Increment(加算) Increase the value of the current memory cell by one. 現在のメモリセルに1加える。 =item - Decrement(減算) Decrease the value of the current memory cell by one. 現在のメモリセルから1引く。 =item > Forward(前進) Move the pointer to the next memory cell. ポインタを次のメモリセルに移動する。 =item < Back(後進) Move the pointer to the previous memory cell. ポインタを前のメモリセルに移動する。 =item , Input(入力) Read a byte from Standard Input and store it in the current memory cell. 標準入力からバイトを読み込み、現在のメモリセルに保存する。 =item . Output(出力) Write the value of the current memory cell to standard output. 現在のメモリセルの値を標準出力に書き出す。 =item [ Loop(繰り返し) If the value of the current memory cell is 0, continue to the cell after the next ']'. 現在のメモリセルの値が0であるなら、次の']'の後ろのセルから続ける。 =item ] Next(次へ) Go back to the last previous '['. 直前の'['に戻る。 =back =head2 ANSI Brainfuckへの拡張 This implementation has extra instructions available. In order to avoid such terrible bloat, they are only available if you use the I pragma like so: このモジュールの実装では追加の命令が利用できる。そのようなひどい無用の 膨張を避けるため、以下のようにIプラグマを使った場合にのみ 利用可能になっている: use Acme::Brainfuck qw/verbose/; The extra instructions are: 追加の命令: =over 4 =item ~ Reset Resets the pointer to the first memory cell and clear all memory cells. ポインタを最初のメモリセルに置きなおし、メモリセルを全てクリアする。 =item # Peek Prints the values of the memory pointer and the current memory cell to STDERR. See also L below. メモリポインタおよび現在のメモリセルの値を標準エラーに出力する。 下記のLを参照のこと。 =back =head2 デバッグ By using the I pragma like this: 以下のようにIプラグマを使う: use Acme::Brainfuck qw/debug/; you can dump out the generated perl code. (Caution: it is not pretty.) The key to understanding it is that the memory pointer is represented by I<$p>, and the memory array by I<@m> Therefore the value of the current memory cell is I<$m[$p]>. 生成されたperlコードをダンプできる(注意:これは綺麗ではない)。 このダンプを理解する鍵は、メモリポインタはI<$p>で表され、メモリ配列はI<@m>で 表されるということだ。よって、現在のメモリセルの値はI<$m[$p]>となる。 =head1 戻り値 Each sequence of Brainfuck instructions becomes a Perl block and returns the value of the current memory cell. Brainfuck命令の連なりはそれぞれPerlのブロックとなる。そして現在の メモリセルの値を返す。 =head1 例 =head2 JABH #!/usr/bin/env perl use Acme::Brainfuck; print "Just another "; ++++++[>++++++++++++++++<-]> ++.-- >+++[<++++++>-]<.>[-]+++[<------>-]< +.- +++++++++.--------- ++++++++++++++.-------------- ++++++.------ >+++[<+++++++>-]<.>[-]+++[<------->-]< +++.--- +++++++++++.----------- print " hacker.\n"; =head2 Countdown #!/usr/bin/env perl use strict; use Acme::Brainfuck qw/verbose/; print "Countdown commencing...\n"; ++++++++++[>+>+<<-] >>+++++++++++++++++++++++++++++++++++++++++++++++<< ++++++++++[>>.-<.<-] print "We have liftoff!\n"; =head2 Reverse #!/usr/bin/env perl use Acme::Brainfuck qw/verbose/; while(1) { print "Say something to Backwards Man and then press enter: "; +[->,----------]< print 'Backwards Man says, "'; [+++++++++++.<]< print "\" to you too.\n"; ~ } =head2 Math #!/usr/bin/env perl use Acme::Brainfuck; use strict; use warnings; my $answer = +++[>++++++<-]> ; print "3 * 6 = $answer \n"; =head1 バージョン 1.1.1 Apr 06, 2004 =head1 作者 Jaldhar H. Vyas Ejaldhar@braincells.comE =head1 謝辞 Urban Mueller - Brainfuckの生みの親 Damian Conway - 想像を絶する奇妙奇天烈の高みにまでperlを捻ってくれた。 Marco Nippula Ehttp://www.hut.fi/~mnippula/E - このモジュールの いくつかのコードは彼のFに由来する。 Mr. Rock - Lで素晴らしいBrainfuckチュートリアルを 公開している。サンプルのいくつかはそれらに由来する。 =head1 著作権とライセンス Copyright (c) 2004, Consolidated Braincells Inc. Licensed with no warranties under the Crowley Public License: "Do what thou wilt shall be the whole of the license." 「汝の欲する所を行うこと 是れぞライセンスの全てとならん」