Digamos que eu defina uma variável local buffer fooe seu valor padrão seja "a":
(defvar foo "a")
(make-variable-buffer-local 'foo)
(default-value 'foo) ;; => "a"
Imediatamente após isso, eu executo o seguinte código:
(let ((foo "b"))
(with-temp-buffer
(message "foo: %s" foo))) ;; => "b"
O resultado é "b", que é o valor que eu defini let.
Agora, se eu usar setqpara definir a variável, execute novamente exatamente o mesmo código de antes:
(setq foo "c") ;; => "c"
(let ((foo "b"))
(with-temp-buffer
(message "foo: %s" foo))) ;; => "a"
O resultado é "a", que é o valor padrão agora.
A pergunta : para um buffer temporário, o valor padrão de foonão é definido até que eu use setq? E enquanto eu não usar setq, posso usar letpara alterar o valor padrão em outros buffers?
EDIT : como disse @npostavs, é isso que make-varible-buffer-localrealmente significa. Se eu make-variable-buffer-localme usar , sempre posso usá-lo setqdepois disso. Mas isso se torna realmente complicado para as variáveis locais do buffer "internas", como case-fold-search. se eu, como autor do pacote, vincular- case-fold-searchme nilao exterior lete desejar usar o valor padrão (ele pode ou não ser definido pelo usuário) no with-temp-buffer, tenho que usar setqantes with-temp-bufferpara garantir que o valor padrão seja realmente sendo usado no caso do usuário não tem que setqem seu / sua init.el. Para variáveis locais de buffer, provavelmente significa que setqé sempre mais seguro do que letquando queremos definir o valor. Gostaria de saber se o design ou a documentação poderiam ser melhorados.
with-temp-buffer(que disse, sem macros). Eu acho que é mais como um comportamento específico para variáveis locais de buffer.
with-temp-buffer(em vez de antes dela), isso ajuda?with-temp-bufferé uma macro e se comporta um pouco diferente de uma função padrão. Exemplo:(with-temp-buffer (let ((foo "b")) (message "foo: %s" foo)))