Qual é o ponto de citação com argumento único e vírgula? (citação, argumento)
15
(quote x)faz x não ser avaliado, mas adicionar um ,na frente de xdentro quotefaz com que seja avaliado. Qual é o objetivo de usar aspas com um único argumento com uma vírgula na frente, assim (quote ,x):?
A vírgula é usada no contexto de uma lista com aspas posteriores (também conhecida como quasiquoted), que permite avaliar algumas partes da lista seletivamente. Consulte também este tópico para obter um exemplo de uso para aspas posteriores.
Alguns exemplos simples:
(setq a "a's value" b "b's value" c "c's value")
'(a b c) ; => (a b c)
`(,a b ,c) ; => ("a's value" b "c's value")
Então, a citação na frente prognsignifica que você precisa colocar uma vírgula na frente das coisas que deseja avaliar, não importa a que distância esteja aninhada? (A ,cmdestá dentro de outra lista, não diretamente dentro (progn).)
The Cat Unfun
Parece uma boa oportunidade para testá-lo! Tente avaliar (setq a "a's value" b "b's value" c "c's value")e depois avaliar `(a '(,b c)).
Dan
Outras notícias: para avaliar, adicione o texto ao seu buffer temporário, coloque o cursor no final da linha e pressione Cxe.
The Unfun Cat
10
Isso é porque está dentro de uma macro. Uma macro precisa retornar um formulário Lisp, que por sua vez é avaliado.
Por exemplo, observando a primeira chamada desta macro:
progn
significa que você precisa colocar uma vírgula na frente das coisas que deseja avaliar, não importa a que distância esteja aninhada? (A,cmd
está dentro de outra lista, não diretamente dentro(progn)
.)(setq a "a's value" b "b's value" c "c's value")
e depois avaliar`(a '(,b c))
.Isso é porque está dentro de uma macro. Uma macro precisa retornar um formulário Lisp, que por sua vez é avaliado.
Por exemplo, observando a primeira chamada desta macro:
Precisamos que a expansão contenha:
o que é o que
(quote ,cmd)
alcança. Se a macro usasse simplescmd
, ela seria mantida literalmente e a expansão seria:que é um erro, porque
cmd
não está definido no ambiente em que a macro é chamada.fonte