¿Por qué (point-min) es mucho más popular que 1?

16

Busqué en todos los archivos Emacs Lisp en Emacs Git repo, y encontré que (goto-char (point-min))ocurre 3621 veces y (goto-char 1)ocurre 31 veces. Personalmente, veo muchos (point-min)pero ninguno 1, incluso en muchos casos, es 100% seguro de que la región no se ha reducido. Así que aquí está mi pregunta: ¿ (point-min)todavía se prefiere que 1incluso en un búfer no reducido?

Supongo que 1es más rápido que (point-min), no importa cuán leve sea, porque 1es constante mientras que (point-min)es una llamada de función. Además, 1es mucho más corto que (point-min)1 carácter frente a 11 caracteres.

xuchunyang
fuente
2
¿Puede proporcionar un ejemplo en el que "es 100% seguro de que la región no se estrecha"? ¿Supongo que quiere decir inmediatamente después de la ampliación? ¿Es realmente "muchos casos"?
Omar
1
Siempre pensé que el búfer comienza a las 0 ...
Omair Majid

Respuestas:

28

¿Cómo sabes que el búfer no se reduce?

A menos que lo haya ampliado justo antes de llamar a la función, no puede estar seguro. Además, el "gran software" a menudo se define como "ser utilizado de maneras que el autor nunca imaginó", por lo que uno siempre debe estar preparado para el uso inusual del código.

La legibilidad del código es el rey

Cuando escribes (goto-char 1), la persona que lee el código (incluyéndote a ti 6 meses después) gastará una preciosa capacidad mental pensando

  • "¿Cómo sabemos que el búfer no se reduce? y
  • "es el primer caracter 0 o 1?"

Básicamente, a menos que tenga (widen)derecho antes, necesita un comentario que explique por qué está seguro de que el búfer no se reduce.

El costo es trivial.

A menos que haya perfilado su código y haya encontrado lo contrario, una suposición segura es que el costo aquí será trivial. En comparación con todas las otras cosas que hace ELisp (red, acceso a disco, incluso coincidencia de cadenas), (point-min)no tendrá un costo significativo (e incluso podría ser más barato , vea la respuesta de Stefan).

sds
fuente
2
+1, especialmente para enfatizar el uso posible de formas inesperadas y la posible reutilización en otros contextos. Una función que usa point-mines generalmente más general que una que usa 1: por lo general, puede funcionar si la región se reduce o no.
Dibujó el
19

Para complementar la respuesta de sds (con lo que estoy totalmente de acuerdo), a pesar de las apariencias, (point-min)puede ser más eficiente que 1. En términos de velocidad de ejecución, mis pruebas no ven ninguna diferencia medible, pero en términos de tamaño:

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> 

Esto se debe a que point-mintiene su propio código de bytes y, por lo tanto, está codificado y ejecutado de manera muy eficiente en comparación con otras llamadas a funciones.

Por supuesto, otra razón para usar point-mines que considero que la elección histórica 1es un error (los buffers deberían haber comenzado en 0).

Stefan
fuente
1
¿La razón que da es solo que el código de byte point-mines ligeramente más pequeño? Parece una razón muy miserable. ¿Por qué darle importancia a eso? ¿O tal vez su respuesta fue realmente como un comentario , solo para corregir la suposición de que uno es más eficiente que el otro o que 1da como resultado un código de byte más pequeño?
Dibujó el