LoginSignup
11
11

More than 5 years have passed since last update.

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

Last updated at Posted at 2014-12-11

あいさつ

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

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は他の事に集中出来る.

  • 楽しい

11
11
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
11
11