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
これが実用になったら、それぞれの言語にあるライブラリが利用できるようになるので、ライブラリを作成する必要がほとんどなくなってしまう。
ほんと夢のような話なのだが、これが実現する日がもう目の前に。