κeenのHappy Hacκing Blog | Lispエイリアンの狂想曲

mirah 0.2がリリースされました。

κeenです。久しぶりにmirahのリリースが出ましたので新機能の紹介をしたいと思います。

リリース版のダウンロードは こちらから。

== のセマンティクス変更

Rubyに合わせて、 == が等価性、 === が同値性の比較になりました。

import java.net.URL

puts "1 == 1 => #{1 == 1}"
puts "1 === 1 => #{1 === 1}"
x = 1; puts "x = 1"
puts "x == x => #{x == x}"
puts "x === x => #{x === x}"
puts "URL.new(\"http://hoge.com\") == URL.new(\"http://hoge.com\") => #{URL.new("http://hoge.com") == URL.new("http://hoge.com")}"
puts "URL.new(\"http://hoge.com\") === URL.new(\"http://hoge.com\") => #{URL.new("http://hoge.com") === URL.new("http://hoge.com")}"
x = URL.new("http://hoge.com"); puts "x = URL.new(\"http://hoge.com\")"
puts "x == x => #{x == x}"
puts "x === x => #{x === x}"
1 == 1 => true
1 === 1 => true
x = 1
x == x => true
x === x => true
URL.new("http://hoge.com") == URL.new("http://hoge.com") => true
URL.new("http://hoge.com") === URL.new("http://hoge.com") => false
x = URL.new("http://hoge.com")
x == x => true
x === x => true

ビルトインMacroの追加

キャスト

今まで、Mirahのキャスト構文は

int(0.5)

のように関数呼び出しっぽい形式でしたが、この度 as! マクロが追加されたので以下のように書けるようになりました。

puts "0.5.as!(int) => #{0.5.as!(int)}"
0.5.as!(int) => 0

Synchronize

javaの Locklock , unlocksychronize マクロでラップしました。Javaのビルトインの synchronized ではない模様。

import java.util.concurrent.locks.ReentrantLock
lock = ReentrantLock.new
counter = 0
th1 = Thread.new do
  100.times do
    lock.synchronize do
      counter += 1
    end
  end
end

th2 = Thread.new do
  100.times do
    lock.synchronize do
      counter -= 1
    end
  end
end

th1.run
th2.run
th1.join
th2.join
puts "counter = #{counter}"

counter = 0

private

private def my_method
  puts "foo"
end

みたいに書けるようになりました。

ラッパークラスの演算子

int に対する Integer のようなラッパークラスにも演算子マクロが定義されるようになました。

b = Integer.new(1); puts "b = Integer.new(1)"
b += 1;puts "b += 1"
puts "a < b => #{a < b}"
a < b => true

他にも色々と定義されているようです。

改善

  • Javaのバイトコードを吐くライブラリasmのバージョンが5になりました。
  • コンパイラのの内部で使っているロガーをマクロで書き直すことでDebug出力しない時のコンパイラの速度が速くなりました(確かこの変更が入った時に20%速くなるって言ってたような)。
  • マクロがサービスプロバイダの仕組みに乗っかるようになりました。 マクロを使うには今までマクロを定義したmirahのソースコードを一緒にコンパイルしないといけなかったのが、Mirahコンパイラがクラスパスから捜すようになったのでJarによる配布が現実的になりました。

最後に

マクロ周りが便利になるなど、興味深い変更がありましたね。 みなさんもこれを機にmirahを使ってみて下さい。

Written by κeen