あいさつ
今日は鼻ピアスを鼻くそみたいにつけられてる方を見ました.
(いやこれがマジで)
HaskellのコードをRubyから文字列で渡して別スレッドでコンパイルしてRubyの文字列で取得するというGemです.
(動的にHaskellのコードを生成出来る!)
前面白がって「実行時にゆるふわ型をチェックするHaskellというGem」を作りましたが、ちょっとアレだったのでRubype に名称を変更し、Haskellという方にはサクッとネタGemをぶち込んでおきました.
Giuhub
(僕が粛々とやっている麻布.hsのプロジェクトとして作りました!麻布にゆかりのあるHaskellerは是非!)
Rubygems
様子
require 'haskell'
# Haskellをコンパイルするためのサンドボックスを作る
Haskell.invoke_sandbox!(File.expand_path('../', __FILE__))
# 別スレッドでコンパイル
Haskell.compile <<-HASKELL
add :: Integer -> Integer -> Integer
add x y = x + y
result = add 1 2
HASKELL
# 待ち時間を楽しみましょう
while Haskell.compiling?
# wait for....
end
# fooo↑
p Haskell.execute
#=> 3
# サンドボックスを潰すのをお忘れなく
Haskell.revoke_sandbox!
こんな感じでHaskellを実行出来ます、返り値はresult
にHaskellのShow
を適応させたもの. すなわちHaskellから返せるのはShow typeclass
(日本語だと型クラスというんだっけ)を由来していないといけない.
ただ単に別スレッド立ててGHC
でコンパイルしているだけなのでコンパイル+実行用の遊び場をHaskell.invoke_sandbox!
とかHaskell.revoke_sandbox!
で作ったり閉じたりするという結構キモい事している.
使ってみる
エラーハンドリング等スカスカですがソースコードもそんな長いもんじゃないので詰まったら読むと良いです.
とりあえずファーストカットもファースカットなのでOS X
用をザックリ書いておきます.
(使えるハードルをまだ高くしておきたい)
GHC を入れる
「Haskellをコンパイル出来る何かにghcというパスが通っている事が必要です」
OS X
なら
$ brew install ghc
でおk
Haskell(Gem)を入れる
$ gem install haskell
でおk
be rake でHaskellのコンパイル始まるの楽しすぎる
こちらはHaskell Gem のテストの様子なのですが、bundle exec rake test
を走らせるとHaskellのコンパイルが始まってクッソ楽しいです.
長所をひねり出してみた
このgemを正当化するための理由をひねくり出してみました.
-
動的なHaskellのコードが書ける
-
Haskellに任せたい処理を別スレッドでやらせてRubyは他の事に集中出来る.
-
楽しい