Pourquoi (point-min) est-il beaucoup plus populaire que 1?

16

J'ai recherché dans tous les fichiers Emacs Lisp dans le repo Emacs Git, et j'ai trouvé (goto-char (point-min))se produit 3621 fois et (goto-char 1)se produit 31 fois. Personnellement, j'en vois beaucoup (point-min)mais aucun 1, même dans de nombreux cas, c'est sûr à 100% que la région n'est pas rétrécie. Voici donc ma question: est (point-min)toujours préféré que 1même dans un tampon non rétréci?

Je suppose que 1c'est plus rapide que (point-min), peu importe à quel point il est léger, car il 1est constant tout en (point-min)étant un appel de fonction. En outre, 1est beaucoup plus court que (point-min)1 caractère contre 11 caractères.

xuchunyang
la source
2
Pouvez-vous donner un exemple où "il est sûr à 100% que la région n'est pas rétrécie"? Je suppose que vous voulez dire immédiatement après l'élargissement? Est-ce vraiment "beaucoup de cas"?
Omar
1
J'ai toujours pensé que le tampon commence à 0 ...
Omair Majid

Réponses:

28

Comment savez-vous que le tampon n'est pas réduit?

À moins que vous ne l'ayez élargi juste avant d'appeler la fonction, vous ne pouvez pas en être sûr. De plus, un "excellent logiciel" est souvent défini comme "étant utilisé d'une manière que l'auteur n'a jamais envisagée" - il faut donc toujours être prêt pour l'utilisation inhabituelle de son code.

La lisibilité du code est roi

Lorsque vous écrivez (goto-char 1), la personne qui lit le code (y compris vous 6 mois plus tard) passera une réflexion sur le cerveau précieux

  • "comment savons-nous que le tampon n'est pas réduit?" et
  • "est le premier caractère 0 ou 1?"

Fondamentalement, sauf si vous l'avez (widen)déjà fait, vous avez besoin d'un commentaire expliquant pourquoi vous êtes sûr que le tampon n'est pas réduit.

Le coût est insignifiant

Sauf si vous avez profilé votre code et constaté le contraire, une hypothèse sûre est que le coût ici sera trivial. Comparé à toutes les autres choses qu'ELisp fait (réseau, accès au disque, même correspondance de chaînes), (point-min)n'aura pas un coût significatif (et pourrait même être moins cher , voir la réponse de Stefan).

sds
la source
2
+1, en particulier pour mettre l'accent sur l'utilisation possible de manière inattendue et la réutilisation possible dans d'autres contextes. Une fonction qui utilise point-minest généralement plus générale que celle qui utilise 1- elle peut généralement fonctionner que la région soit restreinte ou non.
Tiré
19

Compléter la réponse de sds (avec laquelle je suis entièrement d'accord), malgré les apparences, (point-min)peut être plus efficace que 1. En termes de vitesse d'exécution, mes tests ne voient aucune différence mesurable, mais en termes de taille:

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> 

C'est parce qu'il point-mina son propre code d'octet, et est donc codé et exécuté très efficacement par rapport aux autres appels de fonction.

Bien sûr, une autre raison pour laquelle j'utilise point-minest que je considère le choix historique de 1comme une erreur (les tampons auraient dû commencer à 0).

Stefan
la source
1
La raison que vous donnez est seulement que le code d'octet point-minest légèrement plus petit? On dirait une raison assez dérisoire. Pourquoi y attacher de l'importance? Ou peut-être que votre réponse était vraiment un commentaire , juste pour corriger l'hypothèse que l'un est plus performant que l'autre ou que le 1code d'octets est plus petit?
Drew