Saya belajar Haskell, dan saya sedang mencari alat lekukan otomatis. Saya tidak terlihat banyak, dan mengetahui bahwa di Haskell (seperti dalam Python), lekukan menandakan sebuah blok. Akibatnya, saya menduga bahwa tidak mungkin membuat alat pemformatan otomatis, sekuat dalam bahasa lain dalam keluarga C, yang menggunakan penanda eksplisit, seperti {} (kurung kurawal) atau begin
end
kata kunci.
Saya tidak keberatan bahasa yang membuat lekukan agar mudah dibaca, tetapi saya tidak dapat memahami manfaat dari kedua penguatan lekukan dan memiliki beberapa penanda eksplisit, sehingga alat otomatis, dapat memahami apa yang termasuk dalam blok mana.
Jika preferensi lekukan menandai suatu blok, adalah agar kode terlihat lebih baik, maka saya masih tidak mengerti keuntungannya. Mengingat bahwa tab dan spasi diwakili secara berbeda dalam editor dan font yang berbeda (font mono-ruang misalnya terlihat lebih rapi), tidak mungkin mengharapkan programmer untuk menyajikan kode dengan sopan. Alat yang dapat memperhitungkan editor teks saat ini, akan jauh lebih tepat untuk memformat kode dengan benar.
Mengapa perancang bahasa memilih indentasi daripada marker blok eksplisit?
sumber
let x =1; y = 2; z = 3
sepenuhnya valid, sebagaimana adanyado { putStrLn $ show x; putStrLn $ show y; putStrLn $ show z; }
. Mereka tidak perlu berada di jalur yang sama.Jawaban:
Guido Von Rossum
Dari wawancara dengan Guido Van Rossum , yang dapat dilihat dalam teks lengkap dengan books.google.com (penekanan milik saya):
Von Rossum sangat terinspirasi dari ABC , dan meskipun ia tidak harus menyalin semua itu, penggunaan lekukan tetap dipertahankan karena itu bisa bermanfaat dalam menghindari perang agama.
Rossum juga menyaksikan bug karena ketidakkonsistenan antara pengelompokan dan indentasi, dan tampaknya meskipun mengandalkan indentasi hanya untuk menyusun kode akan lebih aman dari kesalahan pemrograman 1 .
Donald E. Knuth & Peter J. Landin
Dalam wawancara yang direferensikan, Guido menyebutkan ide Don Knuth menggunakan indentasi. Ini dirinci dalam Kutipan Indentasi Knuth yang ditemukan kembali , yang mengutip Pemrograman Terstruktur dengan Pernyataan goto . Knuth juga mereferensikan 700 bahasa pemrograman Peter John Landin berikutnya (lihat bagian Diskusi tentang lekukan). Landin mendesain ISWIM yang terlihat seperti bahasa pertama dengan lekukan alih-alih blok awal / akhir. Makalah-makalah itu lebih tentang kelayakan menggunakan indentasi untuk menyusun program daripada argumen aktual yang mendukung melakukannya.
1. Saya pikir ini sebenarnya adalah argumen yang mendukung kedua konstruksi pengelompokan dan pemformatan otomatis, untuk menangkap dan memulihkan dari kesalahan pemrograman, yang pasti akan terjadi. Jika Anda mengacaukan lekukan Anda dengan Python, orang yang mendebug kode Anda harus menebak yang mana yang benar:
Haruskah
bar
selalu dipanggil atau hanya jika tes berhasil?Konstruksi pengelompokan menambahkan tingkat redundansi yang membantu Anda menemukan kesalahan ketika Anda secara otomatis indentasi kode Anda. Di C, kode yang setara dapat diindentasi otomatis sebagai berikut:
Jika saya bermaksud
bar
berada pada level yang sama denganfoo
, maka indentasi otomatis berdasarkan struktur kode biarkan saya melihat bahwa ada sesuatu yang salah yang dapat diperbaiki dengan menambahkan kawat gigi di sekitarfoo
danbar
.Dalam Python: Mitos tentang Indentasi , ada contoh yang seharusnya buruk dari C:
Itu kasus yang sama seperti di atas, di Emacs, saya menyorot seluruh blok / fungsi, tekan Tab, dan kemudian semua kode dihidupkan kembali. Perbedaan antara lekukan manusia dan struktur kode memberi tahu saya ada yang tidak beres (itu dan komentar sebelumnya!).
Selain itu, kode perantara di mana lekukan dimatikan dalam C tidak membuatnya melalui cabang utama, semua cek gaya di tempat akan membuat GCC / Jenkins berteriak padaku. Saya baru-baru ini memiliki masalah yang mirip dengan yang dijelaskan di atas dalam Python, dengan pernyataan off oleh satu tingkat indentasi. Kadang-kadang saya memiliki kode dalam C yang melampaui penjepit penutupan, tetapi kemudian saya menekan Tab dan kode indentasi "salah": itu satu lagi kesempatan untuk melihat bug.
sumber
Ini sangat subyektif dan menyebabkan banyak perang api. Namun:
Memiliki simbol yang membatasi blok dan lekukan melanggar prinsip KERING , karena Anda mengekspresikan informasi yang sama dengan dua cara berbeda. Keberadaan alat indentasi otomatis adalah gejala dari pelanggaran KERING ini: Bahwa Anda dapat secara otomatis menghasilkan indentasi menunjukkan bahwa itu adalah informasi yang berlebihan, dan itu berarti lekukan dan simbol mungkin keluar dari sinkronisasi yang mengarah pada kode menyesatkan.
FAQ Desain dan Sejarah Python menyatakan ini dengan sangat jelas:
Memang benar bahwa Anda tidak dapat membuat alat lekukan otomatis untuk Python, tetapi ini adalah hal yang baik: Itu berarti Anda tidak memiliki redudansi dalam sintaksis yang Anda perlukan alat otomatis untuk melakukan rekonsiliasi.
Tab vs spasi adalah masalah sah dalam Python, dan disarankan untuk tidak pernah mencampur tab dan spasi (untuk indentasi) dalam basis kode yang sama.
Python mewarisi indentasi signifikan dari bahasa pendahulunya (sekarang usang) ABC. ABC adalah salah satu dari sedikit bahasa pemrograman yang telah menggunakan pengujian kegunaan untuk mengarahkan desain. Jadi, sementara diskusi tentang sintaksis biasanya mengarah pada pendapat subyektif dan preferensi pribadi, pilihan indentasi yang signifikan sebenarnya memiliki dasar yang lebih kuat.
sumber
pass
Kata kunci yang dapat disimpulkan secara otomatis, tetapi mengharuskannya secara eksplisit membantu menemukan kesalahan. Redundansi yang tidak disengaja memiliki kedua simbol awal / akhir (untuk kompiler) dan lekukan (untuk pembaca manusia) tampaknya menyebabkan lebih banyak kesalahan daripada yang ditangkap. Setidaknya ini tampaknya menjadi pandangan van Rossum.PROCEDURE DIVISION.
juga? Saya tidak pernah tahu di manaDATA DIVISION
ujung dan prosedurnya dimulai dalam bahasa-bahasa baru ini.Desainer bahasa memilih spasi putih yang signifikan secara sintaksis karena mereka percaya (atau setidaknya berpikir bahwa pengguna potensial mereka percaya) bahwa semi-titik dua dan kawat gigi menambah kebisingan ketika membaca kode, merusak produktivitas. Alasan umum lainnya adalah gaya pengkodean yang buruk / tidak konsisten merusak keterbacaan - dengan memaksakan skema indentasi yang umum, bahasa tersebut memiliki keterbacaan yang lebih baik secara keseluruhan. Alasan yang kemudian menjadi kurang penting sekarang karena IDE pemformatan otomatis lebih umum, tetapi masih dapat diterapkan.
sumber