新千葉 ガーベージ・コレクション

FPGA マガジンやインターフェースで書けなかったこと等をちょぼちょぼ書いてます。@ryos36

Python をさわってみて

Python 実によくできた言語だと思います。C や Perl でどんな風に書いたら可読性が”落ちるのか”を研究していて、そういう書き方が”できない”ようにしているようです。(あくまで個人的な感想)

インデントで整形というのがその典型です。これは構文解析が楽になるという効果もあるようです。

代入したらローカル変数、参照”だけ”はグローバル

面白いと思ったのはこのスコープの扱い。フリー変数の扱いと言い換えてもいいかもしれません。

def func(a):
    b = 3
    return a + b

この b のように”代入したら”ローカル変数です。

def func(a):
    return a + b

ここの b は、参照”だけ”しているのでグローバル変数。この時点で、かの有名な方の持論である PythonLisp の亜種説は崩れます。スコープが特殊なんです。これ、Lisp とは大きく方向性が違う。いいか悪いかはともかくとして、おそらく、このようなスコープは Python 独特で、なかのコンパイラインタプリタの構造を大きく変える(はずです)。事実 HyLang は let を捨てたようです。

じゃ、こんなのはどう?

def func(a):
     c = b
     b = b + 3
     return c + b + a

"UnboundLocalError: local variable 'b' referenced before assignment" と実行時にエラーになります。

if の中で現れたものは?

>>> def iffunc(a):
...     if a :
...         b = 3
...     else :
...         print(a)
...     print(b)
...
>>> iffunc(3==3)
3
>>> iffunc(3!=3)
False
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 6, in iffunc
UnboundLocalError: local variable 'b' referenced before assignment

実行時にかなり頑張っています。

++ とかはない

>>> a++
  File "<stdin>", line 1
    a++
      ^
SyntaxError: invalid syntax

こういう構文シュガーがありません。どっかの言語みたいに構文シュガーの塊のようなことはないんです。載せればいいわけじゃない。

単項演算子の ++ とか -- とかあったほうが便利そうじゃないですか。でも入れると全体のバランスが崩れるんです。折角、参照はグローバルと規定したのに、++ を入れることで、参照だが代入だかわからなくなる。そういう事態を避けるようになっています。この規則のおかげでグローバル変数はたいていの場合"read onlyなデータ"です。関数の中からは書き換えることが出来ません。

こういった、コンパイラの中身や(インタプリタか、、、)書き方の細部にわたって、設計思想がかなりはっきりした言語であり、私にとっては知れば知るほど好感が持てる言語として評価が上がっています。コンパイラインタプリタを作る人はその思想はどうあるべきかを考えるうえで研究対象の筆頭に上がってよい言語だと思います。