[Perl6]急にPugsが来たので@Ubuntu 11.04

この前、完全に忘却の彼方に眠っていたPugsの最新版が公開されていたので、導入してみることにしました。Macでは非常に問題が多く、一筋縄ではいかなかったので、Ubuntu上でPugsを導入してみます。

Macの問題

アーキテクチャの話はズブの素人なので、以下は単なる憶測です。間違ってたらごめんなさい。

  • Snow Leopardはライブラリとかをビルドする時に64bit版のバイナリしか作らないが、Pugsi386向けのバイナリを要求する
    • MacPortsで入れたモノは+universalオプションをつけるとうまくいくかも
    • i386版のlibperl.aの作り方は結局分からなかった
  • MacOSXのオレオレ仕様iconvが上手く動かない

もしMacで成功した人が居たら、何がマズかったのか教えてください…

準備するもの

以下のライブラリをapt辺りから入れておきます。

  • ghc6
  • cabal-install
  • libperl-dev
  • libncurses-dev

また、Pugs自体のソースコード(tar.gz)を以下のページからダウンロードして適当な場所に展開します。

http://hackage.haskell.org/package/Pugs

ソースコードの修正

何故かエラーでコンパイルが通らないので、以下の一行をコメントアウトします。根本的な解決にはなってないので、後々障害の原因となるかもしれません。Haskell分かる人はパッチとか書いても良いんじゃないでしょうか。

diff -ru pugs_orig//src/Pugs/AST/Internals/Instances.hs pugs_modified//src/Pugs/AST/Internals/Instances.hs
--- pugs_orig//src/Pugs/AST/Internals/Instances.hs		2011-05-22 23:35:05.000000000 +0900
+++ pugs_modified//src/Pugs/AST/Internals/Instances.hs		2011-05-22 23:34:29.000000000 +0900
@@ -210,7 +210,7 @@
 instance YAML Dynamic
 instance YAML ProcessHandle
 instance YAML Regex
-instance YAML Unique
+--instance YAML Unique
 instance YAML VComplex
 instance YAML VHandle
 instance YAML VOpaque

あとはcabalにオマカセ

cabalの使い方は全然分からないのですが、ググって出たのを適当にたどります。

$cd ./pugs_modified
$cabal update
$cabal configure
$cabal install

これで~/.cabal/bin以下にpugs, pugs-DrIFTという実行ファイルが生成されて完了です。
試しにバージョンの確認でもしてみましょう。

$./pugs -v
   ______                                                           
 /\   __ \                                                        
 \ \  \/\ \ __  __  ______  ______     (P)erl 6                
  \ \   __//\ \/\ \/\  __ \/\  ___\    (U)ser's           
   \ \  \/ \ \ \_\ \ \ \/\ \ \___  \   (G)olfing      
    \ \__\  \ \____/\ \____ \/\_____\  (S)ystem           
     \/__/   \/___/  \/___/\ \/____/                           
                       /\____/            Version: 6.2.13.15
                       \/___/    Copyright 2005-2010, The Pugs Contributors
--------------------------------------------------------------------
 Web: http://pugscode.org/           Email: perl6-compiler@perl.org 

PugsはRakudoと違って、開き括弧を入力すると閉じるまで待ってくれるので、複数行からなるクラス定義などが書きやすいです。

$./pugs
   ______                                                           
 /\   __ \                                                        
 \ \  \/\ \ __  __  ______  ______     (P)erl 6                
  \ \   __//\ \/\ \/\  __ \/\  ___\    (U)ser's           
   \ \  \/ \ \ \_\ \ \ \/\ \ \___  \   (G)olfing      
    \ \__\  \ \____/\ \____ \/\_____\  (S)ystem           
     \/__/   \/___/  \/___/\ \/____/                           
                       /\____/            Version: 6.2.13.15
                       \/___/    Copyright 2005-2010, The Pugs Contributors
--------------------------------------------------------------------
 Web: http://pugscode.org/           Email: perl6-compiler@perl.org 

Welcome to Pugs -- Perl6 User's Golfing System
Type :h for help.

Loading Prelude... done.
pugs> class hoge {
....> has Str $.foo;
....> method bar () {
....>  say $!foo;
....> }
....> }
method :($__SELF__ is rw is ref, %_) "$_" := "Scalar" #<Scalar:0xb6d3a131>
                                     "%_" := "Hash" #<Hash:0xb6d3b10d>
                                     "$__SELF__" := "Scalar" #<Scalar:0xb6d50041>
                                     "&?BLOCK" := "Sub" #<Sub:0xb702b3c1>
                                     "&?ROUTINE" := "Sub" #<Sub:0xb702b3c1> {"&bar" := "Method" #<Method:0xb6d46585>, "$_" := "Scalar" #<Scalar:0xb703e825>
                                                                                                                      "@_" := "Array" #<Array:0xb703e895>
                                                                                                                      "&?BLOCK" := "Sub" #<Sub:0xb702b3c1>
                                                                                                                      "&?ROUTINE" := "Sub" #<Sub:0xb702b3c1>}{Syn "block" {App &say (: 
                                                                                                                                                                                     Var "$!foo");
                                                                                                                                                                           Noop}}
pugs> my $h = hoge.new(foo => "FOO");
pugs> $h.bar;
FOO

メタクラス周りはまだ実装されていないようですが、簡単なスクリプトなら問題なく実行できそうですね。
次のPerl6勉強会の発表ネタとして、後でRakudoと実効速度のベンチマーク取って比較してみたいと思います。