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間のデータの受け渡しがどんくらいスムーズにできるかはこれから調べる。