名前空間
別に布教活動とかしていないのに、研究室内に Python が広がり始めている。といっても自分以外ではまだ 2 人だけど。
len = len(obj) # ... a = len(x)
みたら、なんか上のようなコードを書いてはまっていた。当然、'int' object is not callable とかいわれる訳だけど。
でまあ、「Python では変数も関数も名前空間一緒だから」みたいなことをいったんだけど、まぁ、あまり親切な説明ではないなぁ。クラスもメソッドも単なるオブジェクトというのは慣れていないと難しいかもしれない。
そういや、
x = x()
として問題になる言語って何があるだろう。
C の関数もオブジェクトではあるけど、代入できないから問題にはなりにくい。宣言も必須だから問題ないかなぁ。
Perl のサブルーチンはそれ自体はオブジェクトじゃないので問題なし。サブルーチンへの参照はオブジェクトだけど。PHP も同様。
Java のメソッド/クラスリテラルもオブジェクトじゃないから問題無し。
public class Foo { public String Foo = "field Foo"; public String Foo() { return "method Foo"; } public Foo() { } public static void main(String[] args) { Foo Foo = new Foo(); System.out.println(Foo); System.out.println(Foo.Foo); System.out.println(Foo.Foo()); System.out.println(Foo.class); } }
Ruby のメソッドもオブジェクトとは別扱い。引数なしで括弧を省略すると見た目がオブジェクト参照と全く同じだから紛らわしい。method(:name) とすればメソッドに対応するオブジェクトを取得できるけど
class Foo def foo :foo end def bar puts foo foo = 5 puts foo end end
Emacs Lisp/Common Lisp は一つの symbol に値と関数(とプロパティ)が関連づくけど参照方法によりどちらかが決まるからある意味名前空間は別。問題ない。
Scheme と JavaScript は手続きもデータもオブジェクトだから問題になる。あれ、案外少ないな。