eval – ¿Hay alguna diferencia entre \ `y backquote?

Pregunta:

Me sorprendió descubrir que si uso Mx ielm , obtengo una cita inversa literal:

ELISP> (read "`foo")
`foo

Sin embargo, si uso M-: (read "`foo") entonces *Messages* y el minibúfer muestran (\` foo) .

¿Son estos dos equivalentes? ¿Por qué (equal (read "`foo") `foo) devuelve t ?

Respuesta:

El valor devuelto por sexp (read "`foo") `foo .

Está confundido por la forma de impresión del valor leído por el comando que está usando ( eval-expression , enlazado a M-: por defecto). Lo que imprime es una representación Lisp del valor. Si en su lugar usa pp-eval-expression , verá `foo , que es el (mismo) valor impreso para humanos . (Esta es una de las varias razones por las que prefiero vincular M-: a pp-eval-expression ).

En cuanto a la representación Lisp, en la biblioteca backquote.el verá este comentario (observe la primera línea):

;; When the Lisp reader sees `(...), it generates (\` (...)).
;; When it sees ,... inside such a backquote form, it generates (\, ...).
;; For ,@... it generates (\,@ ...).

Esa primera línea podría haber dicho que cuando ve `... genera (\` ...) . En otras palabras, lo que se dice no es solo para una lista entre comillas. En su caso, cuando ve `foo genera (\` foo) .

Y (equal (read "`foo") '`foo) devuelve t . (Olvidó citar el segundo argumento para equal . Usó `foo como segundo argumento, pero eso se evalúa – a foo , no `foo , que es lo que quería comparar con el valor de (read "`foo") .)

Leave a Comment

Your email address will not be published. Required fields are marked *

Scroll to Top

web tasarım