Pugs as a library
GHC上でGHC動かすよりもPerl動いた方が嬉しくね?という思いつきの下、Pugsをライブラリとして使えないか模索する方向に。
とりあえず、ここらからPerl6-Pugs-6.2.13を落として適当に眺めると、なんかCabalっぽいものあるし、余裕だねと思った(ていうか、Haskell上で使うことも想定してんのかね)けど、Windows上でビルドできねー。しかも、コンパイル超なげー。2時間くらい待った挙句、libHSPugs-6.2.13.aが生成されなかった時は死のうと思った。cygwinだとダメなのか
仕方ないので、Ubuntuで試すことに。まあなんか普通にPugsできたよ。やったー!いや、それが目的じゃないけど。
Perl6-Pugs-6.2.13ディレクトリ直下にあるMakefile.plを実行すると、Makefileとかが生成されて、更にmakeを実行すると必要なCabalファイルができたり、コンパイルしたりする。んで、makeが終わったら、まず、third-party以下にあるfilepath,fps,HsSyckを、普通にCabal使ってインストール。Setup.hsない場合は、defaultMainだけでいい。んで、makeに失敗してなければ、Perl6-Pugs-6.2.13ディレクトリ直下にPugs.cabalとSetup.lhsがあるはずなので、普通にインストール。GHCのバージョンは6.4.2だった
で、
>cat pugsTest.hs {-# OPTIONS -fglasgow-exts #-} import Pugs main = eval "print (2+3);" > ar xv /usr/lib/perl/5.8/auto/DynaLoader/DynaLoader.a >ghc --make pugsTest.hs -package pugs-fps -package pugs-filepath -package pugs-HsSyck -package Pugs -O -threaded -optl-lperl DynaLoader.o > ./a.out Loading Prelude... done. ***- Evl [Void]: Syn "for" {Var "@*CHECK"; Syn "sub" {{App $_ (: )}}} ***-- Evl [List (Any), LValue]: Var "@*CHECK" ***-- Ret: #<Array:0xb6934f5c> ***-- Evl [Scalar (Code)]: Syn "sub" {{App $_ (: )}} ***-- Ret: {App $_ (: )} ***- Ret: undef ***- Evl [Void]: Syn "=" {Var "@*INIT"; Syn "," {}} ***-- Evl [Void, LValue]: Var "@*INIT" ***-- Ret: #<Array:0xb695eb34> ***-- Evl [List (Any)]: Syn "," {} ***-- Ret: () ***- Ret: #<Array:0xb695eb34> ***- Evl [Void]: App &print (: App &infix:+ (: 2, 3)); Noop ***-- Evl [Void]: App &print (: App &infix:+ (: 2, 3)) ***--- Evl [List (Any)]: Syn "[...]" {Syn "," {App &infix:+ (: 2, 3)}; 0} ***---- Evl [List (Any)]: Syn "," {App &infix:+ (: 2, 3)} ***----- Evl [List (Any)]: Syn "," {App &infix:+ (: 2, 3)} ***------ Evl [List (Any)]: App &infix:+ (: 2, 3) ***------- Evl [List (Any)]: App &infix:+ (: 2, 3) ***------- Ret: 5 ***------ Ret: 5 ***----- Ret: (5,) ***---- Ret: (5,) ***--- Ret: (5,) 5***-- Ret: Bool::True ***- Ret: Bool::True Bool::True
それっぽく動いてるような?なんかもうboot/DynaLoaderが見つからないとか何とか言われるんで、DynaLoader.aからDynaLoader.o切り出してリンクさせてるけど、こんなことしなくてもいい気がする。だって、Pugsのビルドでそんなことしてないし
まあ、私のPerl力だとPerlで書くメリットはあんまないと思うけど、Perlの(多分Haskellよりは)豊富なライブラリが使えればいいなというのと、あとGHCは現状、実質日本語処理ができないので、日本語処理をPugsに投げられるといいなというのと(Pugsが多バイト文字列をサポートしてるのか知らないし、勿論、GHCが多バイト文字列をサポートしてくれればベストだけど)。Haskell<->Pugs間のデータの受け渡しがどんくらいスムーズにできるかはこれから調べる。