Чому (point-min) набагато популярніший за 1?


16

Я шукав усі файли Emacs Lisp в Emacs Git repo, і виявив (goto-char (point-min))це 3621 раз і (goto-char 1)трапляється 31 раз. Особисто я бачу багато, (point-min)але нічого 1, навіть у багатьох випадках, на 100% впевнений, що регіон не звужений. Тож ось моє питання: як і (point-min)раніше віддається перевага, ніж 1навіть у не звуженому буфері?

Я думаю, 1це швидше (point-min), не матер наскільки легкий, тому що 1постійний час (point-min)- це виклик функції. Крім того, 1він набагато коротший, ніж (point-min)1 символ проти 11 символів.


2
Чи можете ви навести приклад, коли "на 100% впевнений, що регіон не звужений"? Я думаю, ви маєте на увазі відразу після розширення? Це справді "багато випадків"?
Омар

1
Я завжди думав, що буфер починається з 0 ...
Омайр Маджід

Відповіді:


28

Звідки ви знаєте, що буфер не звужений?

Якщо ви не розширили його безпосередньо перед тим, як викликати функцію, ви не можете бути впевнені. Більше того, "чудове програмне забезпечення" часто визначають як "використання таким чином, яким автор ніколи не передбачав", тому завжди слід бути готовим до незвичного використання коду.

Читання коду - це King

Коли ви пишете (goto-char 1), людина, яка читає код (включаючи вас через 6 місяців), витратить на дорогоцінні роздуми

  • "як ми знаємо, що буфер не звужений?" і
  • "є першим символом 0 або 1?"

В основному, якщо ви не мали (widen)права раніше, вам потрібен коментар з поясненням, чому ви впевнені, що буфер не звужується.

Вартість банальна

Якщо ви не сформулювали код і не знайшли інше, надійне припущення, що вартість тут буде тривіальною. У порівнянні з усіма іншими речами, які робить ELisp (мережа, доступ до диска, навіть відповідність рядків), (point-min)не матиме значної вартості (і може бути навіть дешевшою , див. Відповідь Стефана).


2
+1, особливо для акцентування можливого використання несподіваними способами та можливого повторного використання в інших контекстах. Функція, яка використовує, point-minяк правило, більш загальна, ніж функція, яка використовується 1- вона може працювати, незалежно від того, чи звужується область.
Дрю

19

Доповнити відповідь sds (з якою я повністю згоден), незважаючи на виступи, (point-min)може бути і більш ефективною, ніж 1. Щодо швидкості виконання, мої тести не бачать різної різниці, але в розмірі:

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> 

Це тому, що point-minмає власний байт-код, і тому кодується та виконується дуже ефективно порівняно з іншими викликами функцій.

Звичайно, ще однією причиною для мене point-minє те, що я вважаю історичний вибір 1помилковим (буфери повинні були починатися з 0).


2
Причина, яку ви наводите, полягає лише в тому, що код байта point-minтрохи менше? Здається, це досить непомітна причина. Чому надають цьому значення? Чи, можливо, ваша відповідь справді розумілася як коментар , щоб просто виправити припущення про те, що один є більш ефективним, ніж інший, або це 1призводить до меншого байтового коду?
Дрю
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.