Mengapa (point-min) jauh lebih populer daripada 1?

16

Saya mencari di semua file Emacs Lisp di repo Emacs Git, dan ditemukan (goto-char (point-min))terjadi 3621 kali dan (goto-char 1)terjadi 31 kali. Secara pribadi, saya melihat banyak (point-min)tetapi tidak ada 1, bahkan dalam banyak kasus, 100% yakin bahwa wilayah tersebut tidak menyempit. Jadi di sini adalah pertanyaan saya: (point-min)masih lebih disukai daripada 1di buffer un-narrowed?

Saya kira 1lebih cepat daripada (point-min), tidak peduli seberapa kecil itu, karena 1konstan sementara (point-min)adalah panggilan fungsi. Selain itu, 1jauh lebih pendek dari (point-min), 1 karakter vs 11 karakter.

xuchunyang
sumber
2
Dapatkah Anda memberikan contoh di mana "100% yakin bahwa wilayah tersebut tidak menyempit '? Saya kira maksud Anda segera setelah melebarkan? Apakah itu benar-benar" banyak kasus "?
Omar
1
Saya selalu berpikir penyangga dimulai pada 0 ...
Omair Majid

Jawaban:

28

Bagaimana Anda tahu bahwa buffer tidak dipersempit?

Kecuali Anda telah melebarkannya tepat sebelum Anda memanggil fungsi, Anda tidak bisa memastikan. Selain itu, "perangkat lunak hebat" sering didefinisikan sebagai "digunakan dengan cara yang tidak pernah dibayangkan penulis" - jadi orang harus selalu siap untuk penggunaan kode yang tidak biasa.

Kode dibaca adalah Raja

Ketika Anda menulis (goto-char 1), orang yang membaca kode (termasuk Anda 6 bulan kemudian) akan menghabiskan pemikiran kekuatan otak yang berharga

  • "bagaimana kita tahu bahwa penyangga tidak dipersempit?" dan
  • "Apakah karakter pertama 0 atau 1?"

Pada dasarnya, kecuali Anda memiliki (widen)hak sebelumnya, Anda perlu komentar yang menjelaskan mengapa Anda yakin buffer tidak dipersempit.

Biaya sepele

Kecuali Anda telah membuat profil kode Anda dan menemukan sebaliknya, asumsi yang aman adalah bahwa biaya di sini akan sepele. Dibandingkan dengan semua hal lain yang dilakukan ELisp (jaringan, akses disk, bahkan pencocokan string), (point-min)tidak akan memiliki biaya yang berarti (dan bahkan mungkin lebih murah , lihat jawaban Stefan).

sds
sumber
2
+1, terutama untuk menekankan penggunaan yang mungkin dilakukan dengan cara yang tidak terduga, dan kemungkinan penggunaan kembali dalam konteks lain. Suatu fungsi yang menggunakan point-minbiasanya lebih umum daripada yang menggunakan 1- ia biasanya dapat berfungsi apakah wilayahnya dipersempit atau tidak.
Drew
19

Untuk melengkapi jawaban sds (yang saya setujui sepenuhnya), meskipun penampilannya, (point-min)bisa lebih efisien daripada 1. Dalam hal kecepatan eksekusi, pengujian saya tidak melihat perbedaan yang dapat diukur, tetapi dalam hal ukuran:

ELISP> (byte-compile '(lambda () (goto-char (point-min))))
#[nil "eb\207" [] 1]

ELISP> (byte-compile '(lambda () (goto-char 1)))
#[nil "\300b\207" [1] 1]

ELISP> 

Itu karena point-minmemiliki kode byte sendiri, dan karenanya dikodekan dan dieksekusi sangat efisien dibandingkan dengan panggilan fungsi lainnya.

Tentu saja, alasan lain bagi saya untuk menggunakan point-minadalah bahwa saya menganggap pilihan historis 1untuk menjadi kesalahan (buffer harus dimulai pada 0).

Stefan
sumber
1
Alasan yang Anda berikan hanya karena kode byte point-minsedikit lebih kecil? Sepertinya alasan yang cukup remeh. Mengapa mementingkan itu? Atau mungkin jawaban Anda benar-benar dimaksudkan sebagai komentar , hanya untuk memperbaiki asumsi bahwa satu lebih berkinerja daripada yang lain atau yang 1menghasilkan kode byte yang lebih kecil?
Drew