[Perl6]急にPugsが来たので@Ubuntu 11.04
この前、完全に忘却の彼方に眠っていたPugsの最新版が公開されていたので、導入してみることにしました。Macでは非常に問題が多く、一筋縄ではいかなかったので、Ubuntu上でPugsを導入してみます。
Macの問題
アーキテクチャの話はズブの素人なので、以下は単なる憶測です。間違ってたらごめんなさい。
- Snow Leopardはライブラリとかをビルドする時に64bit版のバイナリしか作らないが、Pugsはi386向けのバイナリを要求する
- MacOSXのオレオレ仕様iconvが上手く動かない
もしMacで成功した人が居たら、何がマズかったのか教えてください…
準備するもの
以下のライブラリをapt辺りから入れておきます。
- ghc6
- cabal-install
- libperl-dev
- libncurses-dev
ソースコードの修正
何故かエラーでコンパイルが通らないので、以下の一行をコメントアウトします。根本的な解決にはなってないので、後々障害の原因となるかもしれません。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と実効速度のベンチマーク取って比較してみたいと思います。