Happy My Life

日常とか技術とか

PerlとRubyの夢の架け橋、それがParrot

Parrot

Cross-language library loading on Parrot - Stephen Weeksより。

開発中のPerl6がParrotと呼ばれるVirtualMachine上で動作するのは知っている人も多いはず。Virtual Machine上なので、他の言語をParrot上で動作するように移植する事ももちろん可能。

現在はPerl6(rakudo)とParrot上で動作するRuby(cardinal まだまだ未完成版)が一部ではあるが、モジュールを相互に呼び出せるようになってきている。

その文法は以下のよう。

モジュールの呼び出し方

Perl6からRubyのモジュールを呼び出す場合

use Foo:lang<cardinal>;

RubyからPerl6のモジュールを呼び出す場合

foreign_load('perl6','Foo/Bar')

ここに書いてあるコードを検証しようと環境を構築してみたのだが、"load_language" couldn’t find a compiler module for the language ‘cardinal'とエラーになってしまい、検証できず。解決方法も今のところ不明(どなたか、教えてください…)

って事で、そのままコードを転載。こんな風に動くようになる。

RubyからPerlのモジュールを呼び出す

[sweeks@kweh ~]$ cat Foo.pm
module Foo {
sub greet($name) is export {
say "Hello, $name!"
}
}
[sweeks@kweh ~]$ cat perl6.rb
foreign_load 'perl6', 'Foo'
['Ruby', 'Perl', 'World'].each { |name| greet name }
[sweeks@kweh ~]$ cardinal perl6.rb
Hello, Ruby!
Hello, Perl!
Hello, World!

PerlからRubyのモジュールを呼び出す

[sweeks@kweh ~]$ cat Foo.rb
module Foo
def greet(name)
puts "hello, " + name
end
end
[sweeks@kweh ~]$ cat ruby.pl
use Foo:lang;
greet("person $_") for 1..5;
[sweeks@kweh ~]$ perl6 ruby.pl
hello, person 1
hello, person 2
hello, person 3
hello, person 4
hello, person 5

これが実用になったら、それぞれの言語にあるライブラリが利用できるようになるので、ライブラリを作成する必要がほとんどなくなってしまう。

ほんと夢のような話なのだが、これが実現する日がもう目の前に。