グイド・フォン・ロッサム
books.google.com(エンファシス鉱山)で全文を見ることができるGuido Van Rossumのインタビューから:
グループ化のためのインデントの選択は、Pythonの新しい概念ではありませんでした。これはABCから継承しましたが、古い言語のoccamでも発生しました。ABCの作者がoccamからアイデアを得たのか、それとも独立して発明したのか、あるいは共通の祖先がいたのかはわかりません。もちろん、私は私が他の領域(例えば、ABCは、言語のキーワードとプロシージャ名のために、私はコピーしなかったアイデアを大文字を使用)、で行ったように、ABCのリードに従わないことを選んだかもしれないが、私は機能のように来ていたかなりビット、ABCを使用している間、Cの間での無意味な議論の共通の特定の種類を廃止するように見えたとしてについては、一度にユーザーの中括弧をどこに配置しますか。
Von RossumはABCから多大なインスピレーションを得ており、そのすべてをコピーする必要はありませんが、宗教戦争を避けるのに有益である可能性があるため、インデントの使用は維持されました。
また、読み取り可能なコードはグループ化を示すためにインデントを自発的に使用することもよく知っていました。インデントが中括弧を使用した構文グループ化と一致しないコードの微妙なバグに遭遇しました。したがって、バグに気づきませんでした。繰り返しますが、長いデバッグセッションは貴重な教訓を教えてくれました。
Rossumは、グループ化とインデントの不一致によるバグも目撃しましたが、コードの構造化のみにインデントを使用する方が、プログラミングエラー1から安全になります。
ドナルドE.クヌース&ピーターJ.ランディン
参照されたインタビューで、Guidoはインデントを使用するというDon Knuthのアイデアに言及しています。これは、再発見されたKnuth Indentation Quoteで詳しく説明されています。これは、構造化プログラミングとgotoステートメントを引用しています。Knuthは、Peter John LandinのThe next 700 programming languages(インデントについてのディスカッションセクションを参照)も参照しています。Landin は、開始/終了ブロックではなくインデントを使用した最初の言語のように見えるISWIMを設計しました。これらの論文は、プログラムを構造化するためにインデントを使用することの実現可能性に関するものであり、実際にそうすることを支持する議論ではありません。
1.これは実際には、発生するはずのプログラミングエラーをキャッチして回復するために、グループ化構造と自動フォーマットの両方を使用することを支持する議論だと思います。Pythonでインデントを台無しにした場合、コードをデバッグする人はどちらが正しいかを推測する必要があります。
if (test(x)):
foo(x)
bar(x)
シャルbar
常に呼び出されるかだけテストが成功した場合はどうなりますか?
グループ化構造は、コードの自動インデント時に間違いを見つけるのに役立つ冗長性のレベルを追加します。Cでは、同等のコードを次のように自動インデントできます。
if (test(x))
foo(x);
bar(x);
bar
と同じレベルにすること
を意図している場合foo
、コード構造に基づいた自動インデントにより、foo
との周りに中括弧を追加することで修正できる問題があることがわかりますbar
。
でPythonの:インデントについての神話、Cからおそらく悪い例があります:
/* Warning: bogus C code! */
if (some condition)
if (another condition)
do_something(fancy);
else
this_sucks(badluck);
これは上記と同じです。Emacsでは、ブロック/関数全体を強調表示し、Tabキーを押すと、すべてのコードが再インデントされます。人間のインデントとコード構造の不一致は、何かがずれていることを示しています(それと前のコメント!)。
その上、Cでインデントがオフになっている中間コードは、単にmasterブランチを通過しません。すべてのスタイルチェックが行われると、GCC / Jenkinsが悲鳴を上げます。私は最近、Pythonで上記で説明したものと同様の問題を抱えていました。Cで閉じ括弧を超えるコードがある場合もありますが、Tabキーを押すとコードが「間違って」インデントします。これはバグを確認するもう1つの機会です。
let x =1; y = 2; z = 3
そのままで完全に有効ですdo { putStrLn $ show x; putStrLn $ show y; putStrLn $ show z; }
。それらは同じ行にある必要はありません。