Perché (point-min) è molto più popolare di 1?


16

Ho cercato tra tutti i file Emacs Lisp nel repository Emacs Git e ho riscontrato che si (goto-char (point-min))verificano 3621 volte e (goto-char 1)31 volte. Personalmente ne vedo molti (point-min)ma nessuno 1, anche in molti casi, è sicuro al 100% che la regione non sia ristretta. Quindi, ecco la mia domanda: è (point-min)ancora preferito 1anche nel buffer non ristretto?

Immagino 1sia più veloce di (point-min), non importa quanto sia leggero, perché 1è costante mentre (point-min)è una chiamata di funzione. Inoltre, 1è molto più breve di (point-min), 1 carattere contro 11 caratteri.


2
Puoi fornire un esempio in cui "è sicuro al 100% che la regione non sia ristretta"? Immagino che intendi subito dopo l'ampliamento? Sono davvero "molti casi"?
Omar,

1
Ho sempre pensato che il buffer inizia alle 0 ...
Omair Majid

Risposte:


28

Come fai a sapere che il buffer non è ristretto?

A meno che tu non l'abbia ampliato prima di chiamare la funzione, non puoi esserne sicuro. Inoltre, "ottimo software" è spesso definito come "utilizzato in modi che l'autore non ha mai immaginato" - quindi si dovrebbe sempre essere preparati all'uso insolito del proprio codice.

La leggibilità del codice è re

Quando scrivi (goto-char 1), la persona che legge il codice (incluso te 6 mesi dopo) spenderà preziose capacità di pensiero

  • "come facciamo a sapere se il buffer non è ristretto?" e
  • "è il primo carattere 0 o 1?"

Fondamentalmente, a meno che tu non l'abbia fatto (widen)prima, hai bisogno di un commento che spieghi perché sei sicuro che il buffer non sia ristretto.

Il costo è banale

A meno che tu non abbia profilato il tuo codice e trovato diversamente, un presupposto sicuro è che il costo qui sarà banale. Rispetto a tutte le altre cose che fa ELisp (rete, accesso al disco, persino corrispondenza delle stringhe), (point-min)non avrà un costo significativo (e potrebbe anche essere più economico , vedi la risposta di Stefan).


2
+1, in particolare per enfatizzare l'uso possibile in modi inaspettati e il possibile riutilizzo in altri contesti. Una funzione che utilizza point-minè in genere più generale di una che utilizza 1: in genere può funzionare indipendentemente dal fatto che la regione sia ristretta.
Drew

19

Integrare la risposta di sds (con la quale concordo pienamente), nonostante le apparenze, (point-min)può essere più efficiente di 1. In termini di velocità di esecuzione, i miei test non vedono alcuna differenza misurabile, ma in termini di dimensioni:

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> 

Questo perché point-minha un proprio codice byte, ed è quindi codificato ed eseguito in modo molto efficiente rispetto ad altre chiamate di funzione.

Naturalmente, un altro motivo per me da usare point-minè che considero la scelta storica di 1essere un errore (i buffer dovrebbero essere iniziati a 0).


1
Il motivo che dai è solo che il codice byte per point-minè leggermente più piccolo? Sembra una ragione piuttosto irrisoria. Perché dare importanza a questo? O forse la tua risposta è stata davvero intesa come un commento , per correggere il presupposto che uno è più performante dell'altro o che si 1traduce in un codice byte più piccolo?
Drew
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.