Ruby内にHaskellのコード埋め込むHaskellというGem作ったヨ!


あいさつ

今日は鼻ピアスを鼻くそみたいにつけられてる方を見ました.
(いやこれがマジで)

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のコンパイルが始まってクッソ楽しいです.

Gyazo

長所をひねり出してみた

このgemを正当化するための理由をひねくり出してみました.

  • 動的なHaskellのコードが書ける

  • Haskellに任せたい処理を別スレッドでやらせてRubyは他の事に集中出来る.

  • 楽しい