Digamos que eu defina uma variável local buffer foo
e 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 setq
para 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 foo
não é definido até que eu use setq
? E enquanto eu não usar setq
, posso usar let
para alterar o valor padrão em outros buffers?
EDIT : como disse @npostavs, é isso que make-varible-buffer-local
realmente significa. Se eu make-variable-buffer-local
me usar , sempre posso usá-lo setq
depois 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-search
me nil
ao exterior let
e desejar usar o valor padrão (ele pode ou não ser definido pelo usuário) no with-temp-buffer
, tenho que usar setq
antes with-temp-buffer
para garantir que o valor padrão seja realmente sendo usado no caso do usuário não tem que setq
em seu / sua init.el
. Para variáveis locais de buffer, provavelmente significa que setq
é sempre mais seguro do que let
quando 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)))