ボスケテー
PurePerlでメルセンヌ・ツイスタな話。Ver.0.1 - 永字八法の続き。
初めて使うモジュールInlineを試す。なんでもこれは、Perlのソース中に他の言語でソースを書いておくと、それを読んでコンパイルした上でPerlの中から使えるようにしてくれるものらしい。なんて変態チックなんだ。さすがPerlだ。
つうか、あっさりPurePerlって制約を諦めてるな。いや、そうじゃないんだ。これは、まずはきっちり動くMTのサンプルが欲しいんだ。
それで、PurePerlのを作った後で、同じ種を与えて同じ結果が出たらうまく動いているとみなす予定なんだよ!
てなわけで、ざっと作ってみた。
inline.pl
メルセンヌ・ツイスターを作って0で初期化して、最初の10万個の乱数をテキストに書き出すプログラム。
use strict; use utf8; use Inline 'C'; init_genrand(0); open ( OUT, '>rnd.txt' ); foreach ( 1..100000 ) { print OUT &genrand_int32(); print OUT "\n"; } close ( OUT ); __END__ __C__
ここから下は、MTのソースのコピペ
どうなったか。
「nmakeどこよ?」
と聞かれたので、nmakeを置いてパスを通す。
再実行。
「clどこよ?」
と聞かれたので、MinGWをインストール。
「g++どこよ?」
と聞かれたので、MinGWの中のどれかを使ってmsysをインストール。
「うしっ、できたぞ。実行してみっかー! init_genrandを実行……ん?」
Can't locate auto/main/genrand_int.al in @INC...
色々調べてみた結果、どうやら、C言語ソース部分で、staticで関数宣言をすると、その関数はPerlからは見えなくなる仕様のようだ(Inline::Cのpodより)。その結果、「念のためにありそうなファイルを開いてみるか」となって、genrand_int.alを探して開いてみようとするけれども、それが見つからないので文句を言っているようだ。たぶん。