tuneoの日記: Pythonで関数の前方参照をしないわけ 2
日記 by
tuneo
「動的言語だから」の一言で説明が付きます。
たとえば前方参照が可能だったとして、以下のコードはどうなるか。
r = int(raw_input().strip()) % 2
print f(3) # ここで前方参照
if r == 0:
def f(x):
return x
else:
pass
このコードは、print f(3)を末尾に移動すればPython的には全く問題なく、実行すればキチンと期待通りに「偶数を入力すると3を表示し、奇数を入力するとfが未定義なためにNameError例外が発生する」という珍妙な挙動を示します。fが未定義なのか、決定できるのは実行時だけです。
ただでさえ「実行時にならないとわからない」のに前方参照などナンセンス。「関数の前方参照」と動的言語は相容れないのです。
もちろん関数の前方参照も(あれこれ制約を付ければ)技術的には可能ですが、Pythonの開発者はそんなくだらないことをするより「前方参照は一切やらねー」と決めた、ということですね。
他のオブジェクトは前方参照なんかしないわけで、関数呼び出しだけ別扱いってのも変な話じゃないですか……というのをメインに説明したらものっそい屁理屈言われたのでちゃんとPythonicな説明を考えてみましたよ。
PythonはLispです (スコア:1)
PythonをPerlの延長と考えるからいけないのです。
PythonはLispなのです。
と言えば良かったのでは。
Re:PythonはLispです (スコア:1)
私はLisp知らないんでそういうセリフは言えないです。