カラクリサイクル

『輝かしい青春』なんて無かった人の雑記

Perlのパッケージについてのメモ

概要: Perlのパッケージについてのメモ。


PerlのパッケージをJavascriptにできる限り忠実に移植するため、 Perlのパッケージの挙動を簡単にまとめてみる。

  • package = Class名
  • デフォルトのパッケージ名はmain
  • パッケージの有効範囲はそのBlock内
  • パッケージ内のグローバル変数、関数はそのパッケージに属する

ぐらい?

ちなみにJavascriptにはパッケージなんて無いんだけど、JSANの場合、

  • Class名 = グローバルオブジェクトの階層 (例:Foo.Bar = {}みたいな)
  • クラスに属する変数、関数はprototypeに突っ込む(?)

のような感じだったりする。

さっき気づいたけど、Javascriptでパッケージみたいなのを実装しようとすると、 下位の名前空間と上位の変数(若しくは関数)が衝突しやすいような気がする。 あ、でもPerlでも同じか?関数指向だと衝突しやすくて、オブジェクト指向だと衝突しにくいのかな?

ちょっと実験

package Foo::Bar;
sub Baz { print "aaa\n" }
package Foo::Bar::Baz;
sub new { bless {}, shift }
package main;
Foo::Bar::Baz();
print ref(Foo::Bar::Baz->new());

実行結果

aaa
aaa
Can't call method "new" without a package or object reference at - line 9.

こうなったということは、関数指向のpackageの下位にオブジェクト指向のpackageを作ろうとすると、 衝突することがある、ということか。

Rubyとかどうなっているんだろう?ちらっとコード見かけたことあるけど、

Foo::Bar.new()

こんな感じだったから衝突しないのかな?詳しくは知らないけど。うーん。