2023年10月14日土曜日

Pythonのインデントでブロックを表す方式についてどう思いますか?なぜ、他の言語にはあまり広まらないのでしょうか?

https://jp.quora.com/Python%E3%81%AE%E3%82%A4%E3%83%B3%E3%83%87%E3%83%B3%E3%83%88%E3%81%A7%E3%83%96%E3%83%AD%E3%83%83%E3%82%AF%E3%82%92%E8%A1%A8%E3%81%99%E6%96%B9%E5%BC%8F%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6%E3%81%A9%E3%81%86%E6%80%9D

Shunichi Araiさんのプロフィール写真
 · 
フォロー

まつもとゆきひろさんがQuora上にも良く書いてますが、重大な問題があります。

式と文が明確に別れてしまうので、lambda(無名関数)の柔軟性が下がって使いにくくなります。

現在のプログラミングにおいて無名関数はきわめて重要な要素なので、それが弱いというのはプログラミング言語として重大な欠陥だと考えています。

だから、これを他の言語に広めるのはやめたほうがいいでしょう。ふつうに{}で表せば良いと思います。

Rubyのブロック構文は近年のプログラミング言語のなかで最良の発明だと思うので、他の言語に広まって欲しいのですが、なかなか広まらないですね。

Junji Ueharaさんのプロフィール写真
 · 
フォロー

インデントがブロックを表すと、コピペがしにくいということがあります。あるコードブロックをコピーして別の箇所にペーストしたとき、もとの場所でのネストレベルが引き継がれ、貼り込んだ先で意図するネストレベルと一致する保証がなく、自動的に正しいインデントにする方法はありません。例えば、

  1. print("world") 

を、

  1. if status == 3: 
  2. print("hello") 
  3.  

の星の部分にペーストするとして、その結果は

  1. if status == 3: 
  2. print("hello") 
  3. print("world") 

なのか、

  1. if status == 3: 
  2. print("hello") 
  3. print("world") 

なのか、プログラマが意図するものがどちらかなのかをエディタは自動判別することが基本的にはできません。

これに対して、ブロックの開始、終了を明示する言語であればこの問題は発生しません。

目を皿のようにして手動でインデントを治すのは、今の自動インデントをするエディタではもどかしいものです。

Pythonなどのインデント=ブロックの考え方は、どうせインデントは手で整えるのでしょ、だったらそれをもとにしてブロックの定義としても損しないよね、インデントとブロックの両方に気を使う手間も減るよね、ということがあると考えます。(あと文字が減ることのシンプルな見た目。)

もしそうなら最近のエディタでは自動フォーマットが普通になり、インデントに気を使うことはそもそもなくなり、ブロックだけを意識すればいいので、上の意図での相対的利点は実質的に消失したことになります。

文字数が減ることのシンプルさは残りますが、好みだし、コピペのデメリット、ブロック明示言語の自動フォーマットによるメリット拡大も考慮すると採用する動機が昔よりも大きく損なわれていると考えます。

aws lambdaで、Webコンソールのform内に直接pythonコードコピペする時など、実際使いにくい時もあるのでは。

あとreplでヒストリからワンライナー的に使うのはどうなんでしょう。インデント=ブロックでもやればできるのかな。

広告
林田 哲郎さんのプロフィール写真
 · 
フォロー

Vimmerという人種が ci{ というコマンドでブロック編集したいがためです。

0 コメント:

コメントを投稿