矢印演算子 ->
は、何の為に残しておきたかったのかしら?
高木センセーがブクマで以下のように批評していらっさる訳ですが、
例えばJavaで、「LinkedList x = new LinkedList()
」と書かずにわざわざ「List x = new LinkedList()
」と書くことの意義を理解していない。
それは恐らく instance (Perl 的に言えば invocant) の型ではなくて、それを受け容れる変数そのものが、受け容れる値の型を限定することの意義、ということなのでしょう。確かに、
home = getenv('HOME'); /* home is char * because getenv() returns char * */
「getenv()
は char *
を返すから、home
も char *
だ」という解釈がまかり通ってしまうと、将来的にはこの home
という変数には、char *
以外の型の値が入ってきてもいいように見えます (実際 Perl はそんな感じの世界ですね)。Perl は値の型よりもコンテキストが優先される言語であるため、大抵の局面においてはそれで問題がないわけですが、一方でオブジェクトを扱う局面においては、bless
された invocant に対して ref
や isa
メソッドで所属する package (一般にいうところの class) を調べたり、can
メソッドで特定のメソッドが存在するかどうかを調べたりすることによって型の厳密性を担保する必要も出てきます。
そういう意味では、Perl の世界観ってのは、ある程度の物事の厳密性に対して、「そもそもプログラマーが間違えなきゃいいんじゃん」という価値観がまかり通っている部分もあるわけですが、その一方で、間違ったハンガリアン記法の使われ方がその手の間違いを誘発しまくっていたりする現実があったりして、そして世の中の Java やら C++ やら D やらのコンパイラが頭よくなってきてくれたおかげでそもそも型を意識する作業はコンパイラに任せておけばいいという考え方がやっと定着してきているんかなぁというこのご時世において、再びプログラマが型を意識しなきゃならんような言語を、それもスクリプト言語としてではなくてアセンブラのマクロとして提供することの意義ってそんなにあるのかなぁっていう疑問はあるわけですが。。。
しかし次回のテーマが代入演算子としてよく使われている =
であるということで、もしかしたらこの辺のことについても実は十分認識していて、その解決策を次回は述べられるのかなぁなどという期待もあったり。。。つまり、C++ では通常の代入は値渡し (すなわち、コピー) で、ポインタの代入が参照渡しになるわけですが、Perl では (摩訶不思議なコピーコンストラクタのカラクリは存在するものの) =
は参照渡しとしてしか使えないので、この辺をどうにか切り分けられればいろいろと解決できる問題もあって、そういう世界観ならそもそも型宣言なんて不要なんじゃねーの、という論展開になるんじゃないかと予想するわけですが。。。違うかなぁ? (((((((((/;^^)/
tb どもです。
型推論でhomeの型を決定しているのだから、char *以外の型の値が入るわけ無いと思います。
なるほど。だとすると、ますます高木氏のおっさられる通りですやんね。
セコメントをする