Por que (ponto-min) é muito mais popular que 1?


16

Eu procurei em todos os arquivos do Emacs Lisp no repo do Emacs Git e encontrei (goto-char (point-min))ocorre 3621 vezes e (goto-char 1)ocorre 31 vezes. Pessoalmente, vejo muitos, (point-min)mas nenhum 1, mesmo em muitos casos, é 100% certo de que a região não é reduzida. Então, aqui está a minha pergunta: (point-min)ainda é preferido do que 1mesmo no buffer não estreitado?

Eu acho que 1é mais rápido do que (point-min), por menor que seja, porque 1é constante enquanto (point-min)é uma chamada de função. Além disso, 1é muito menor do que (point-min)1 caractere vs 11 caracteres.


2
Você pode fornecer um exemplo em que "é 100% certo de que a região não é reduzida"? Acho que você quer dizer imediatamente após o alargamento? São realmente "muitos casos"? "
Omar

1
Eu sempre pensei que os tampão começa em 0 ...
Omair Majid

Respostas:


28

Como você sabe que o buffer não é reduzido?

A menos que você o tenha ampliado antes de chamar a função, você não pode ter certeza. Além disso, "ótimo software" é frequentemente definido como "sendo usado de maneiras que o autor nunca imaginou" - portanto, deve-se estar sempre preparado para o uso incomum de seu código.

A legibilidade do código é o rei

Quando você escreve (goto-char 1), a pessoa que lê o código (incluindo você 6 meses depois) gasta preciosos recursos intelectuais pensando

  • "como sabemos que o buffer não é reduzido?" e
  • "é o primeiro caractere 0 ou 1?"

Basicamente, a menos que você tenha feito (widen)isso antes, você precisa de um comentário explicando por que está confiante de que o buffer não é reduzido.

O custo é trivial

A menos que você tenha perfilado seu código e encontrado o contrário, uma suposição segura é que o custo aqui será trivial. Comparado a todas as outras coisas que o ELisp faz (rede, acesso ao disco e até correspondência de cadeias), (point-min)não terá um custo significativo (e pode até ser mais barato , veja a resposta de Stefan).


2
+1, especialmente para enfatizar o uso possível de maneiras inesperadas e a possível reutilização em outros contextos. Uma função que usa point-minnormalmente é mais geral do que uma que usa 1- normalmente pode funcionar se a região é reduzida ou não.
21416 Drew

19

Para complementar a resposta do sds (com a qual concordo plenamente), apesar das aparências, (point-min)pode ser mais eficiente do que 1. Em termos de velocidade de execução, meus testes não veem nenhuma diferença mensurável, mas em termos de tamanho:

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> 

Isso point-minocorre porque possui seu próprio código de bytes e, portanto, é codificado e executado com muita eficiência em comparação com outras chamadas de função.

Obviamente, outro motivo para eu usar point-miné que considero a escolha histórica 1um erro (os buffers deveriam ter começado em 0).


1
O motivo é que o código de bytes point-miné um pouco menor? Parece uma razão bastante insignificante. Por que atribuir importância a isso? Ou talvez sua resposta tenha realmente sido um comentário , apenas para corrigir a suposição de que um é mais eficiente que o outro ou que 1resulta em um código de bytes menor?
Drew
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.