オードリーたんは、一ヶ月でHaskellマスターして一ヶ月でPugs書いたとか聞いたので、どんだけ仕事速いねんと思ったら、Pugs-6.0.0はすっごいシンプルだった。
http://search.cpan.org/src/AUTRIJUS/Perl6-Pugs-6.0.0/
これなら一ヶ月というのも理解できる。

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

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

Golfing Systemて。PerlはPolymorphic Existential Recursive Lambdasらしい


本題。WindowsでのPugsビルドリベンジ。正直こういう作業はちっとも楽しくないよな〜ほえー。適当に調べてると、cygwinでビルドできなくもないらしいけど、色々めんどくさそうなので、まあやめといた方がよさげ。

http://wiki.kn.vutbr.cz/mj/index.cgi?Pugs%20on%20MS%20Windows
を見ると、ActivePerlとnmake(とGHC)があればいけると書いてあったので、試したらあっさりできた。GHCのバージョンは6.6。Pugsのバージョンは6.2.13。一応インストールまでしておいた方がいいっぽい。Perlのライブラリの関係で

で、

C:\ghc\Perl6-Pugs-6.2.13>cp third-party\fps\Setup.hs third-party\filepath
C:\ghc\Perl6-Pugs-6.2.13>cd third-party\filepath
C:\ghc\Perl6-Pugs-6.2.13\third-party\filepath>runhaskell Setup.hs configure
C:\ghc\Perl6-Pugs-6.2.13\third-party\filepath>runhaskell Setup.hs build
C:\ghc\Perl6-Pugs-6.2.13\third-party\filepath>runhaskell Setup.hs install
C:\ghc\Perl6-Pugs-6.2.13\third-party\filepath>cd ..\fps
C:\ghc\Perl6-Pugs-6.2.13\third-party\fps>runhaskell Setup.hs configure
C:\ghc\Perl6-Pugs-6.2.13\third-party\fps>runhaskell Setup.hs build
C:\ghc\Perl6-Pugs-6.2.13\third-party\fps>runhaskell Setup.hs install
C:\ghc\Perl6-Pugs-6.2.13\third-party\fps>cd ..\HsSyck
C:\ghc\Perl6-Pugs-6.2.13\third-party\HsSyck>runhaskell Setup.hs configure
C:\ghc\Perl6-Pugs-6.2.13\third-party\HsSyck>runhaskell Setup.hs build
C:\ghc\Perl6-Pugs-6.2.13\third-party\HsSyck>runhaskell Setup.hs install
C:\ghc\Perl6-Pugs-6.2.13\third-party\HsSyck>cd ..\..
C:\ghc\Perl6-Pugs-6.2.13>runhaskell Setup.lhs configure
C:\ghc\Perl6-Pugs-6.2.13>runhaskell Setup.lhs build
C:\ghc\Perl6-Pugs-6.2.13>runhaskell Setup.lhs install
C:\ghc\Perl6-Pugs-6.2.13>ghc-pkg list
C:/ghc/ghc-6.6\package.conf:
    Cabal-1.1.6, GLUT-2.0, HUnit-1.1, OpenGL-2.1, Pugs-6.2.13,
    QuickCheck-1.0, Win32-2.0, base-2.0, cgi-2006.9.6, fgl-5.2,
    (ghc-6.6), haskell-src-1.0, haskell98-1.0, html-1.0, mtl-1.0,
    network-2.0, objectio-1.0, parsec-2.0, pugs-HsSyck-0.2,
    pugs-filepath-0.1, pugs-fps-0.7, readline-1.0, regex-base-0.71,
    regex-compat-0.71, regex-posix-0.71, rts-1.0, stm-2.0,
    template-haskell-2.0, time-1.0, xhtml-2006.9.13

buildはいらん気もするけど、まあ一応。Pugs-6.2.13, pugs-HsSyck-0.2, pugs-filepath-0.1, pugs-fps-0.7が追加されてればOK


んで、

import Pugs
main = eval "2+3;"

とかをコンパイルしようとすると、C:\ghc\ghc-6.4.1\include\HsBase.hの__hscore_d_nameがどーたらというエラーが出る。

http://folksonomy.sakura.ne.jp/perl/pugs_build.html
によると、これは使われてない関数なのでコメントアウトしていいらしい。あと、libperl58.aがないので、同じリンク先に書いてあるようにExtUtils::FakeConfigをダウンロードして展開してインストール(libperl58.aはghc6.6/gcc-libとかにいれとくといいかもしれない)。んで、あとは適当にpackageとライブラリ指定してコンパイルすればOKっぽい。んだけど、普通にlibperl58.a指定するとなんでかリンクがうまくいかない。何かすごいアホなことな気がするんだけど、なんだろうな〜


注意
コンパイルが非常に時間かかる。
cygwin-bash上ではうまく実行できない
・GHCiでインタラクティブに開発できない

1つ目と3つ目はものっそいやる気なくなる。



できれば、GHCi上で、":set -package Pugs"で使えるようにしたいんだけど、うまくいかない。ぬー、なんとかやりようはあるんじゃないかと思ったりするんだけど。 unknown symbol `__imp__Perl_win32_init`。しらべんのめんどくせ。Ubuntuの方も

>ghci -lperl DynaLoader.o
Loading package base-1.0 ... linking ... done.
Loading object (static) DynaLoader.o ... done
Loading object (dynamic) perl ... done
final link ... ghc-6.4.2: DynaLoader.o: unknown symbol `_GLOBAL_OFFSET_TABLE_'
ghc-6.4.2: linking extra libraries/objects failed

はぁ・・・対策はそのうち。ここらへんも障害になりそうだ



Parrotとは。Parrotとか聞いたことすらなかった
http://www.namikilab.tuat.ac.jp/~sasada/prog/parrot-intro.html

第一に、とにもかくにも、Parrot って何? なんでみんなこれについて大騒ぎしてんの? えーと。もしあなたが箱の中で暮らしてでもいなければ、Perl コミュニティが新しい Perl のデザインと、その実装をしているのを知ってるよね。新バージョンのPerl、言語と実行処理系の両方。

すいません、箱の中で暮らしていたようです。まあ、Perl6のVMになるらしい。ふーん、どうでもいいや。なんかcompileがどうとかあるのは、要するにParrotのコード吐くのか。中間言語のJakoがいいな


で、Pugsのソースを眺めた。重要なのは、Exp,Val,Evalモナド(多分)。Expの定義はなんか2箇所にあるけど、Pugs.AST.Internalsにある方が本物っぽい

-- | Represents an expression tree.
data Exp
    = Noop                              -- ^ No-op
    | App !Exp !(Maybe Exp) ![Exp]      -- ^ Function application
                                        --     e.g. myfun($invocant: $arg)
    | Syn !String ![Exp]                -- ^ Syntactic construct that cannot
                                        --     be represented by 'App'.
    | Ann !Ann !Exp                     -- ^ Annotation (see @Ann@)
    | Pad !Scope !Pad !Exp              -- ^ Lexical pad
    | Sym !Scope !Var !Exp              -- ^ Symbol declaration
    | Stmts !Exp !Exp                   -- ^ Multiple statements
    | Prim !([Val] -> Eval Val)         -- ^ Primitive
    | Val !Val                          -- ^ Value
    | Var !Var                          -- ^ Variable
    | NonTerm !Pos                      -- ^ Parse error
    deriving (Show, Eq, Ord, Typeable) {-!derive: YAML_Pos!-}

ふむ。Haskellの値をPugsの値に変換したり、逆も簡単にできそうな感じ