Respuesta

40

Creo que esta noción proviene de los lenguajes Lisp.

programa escrito en Lisp consiste en una serie de listas de listas de listas, etc., así:

(defn f [x y] (+ x y)) 

Debido a tal uniformidad es posible representar y manipular código como los datos, por lo que la secuencia de caracteres arriba se interpreta como una lista literal. Esta es una característica muy útil de Lisps, una de sus características distintivas. Para mayor comodidad, los lenguajes Lisp permiten 'citar' secuencias significativas, convirtiéndolas de definiciones y expresiones en listas. Se ve así:

'(defn f [x y] (+ x y)) 

En este caso se trata de una lista literal, directa disponible para desestructurar utilizando análogos de head y tail y otros métodos de Haskell. Entonces, 'cita' significa 'hacer un valor literal de la lista'.

Sin embargo, no es conveniente manipular listas directamente con head - y tail -como funciones similares. Se vuelve notable cuando comienzas a escribir macros complejas o incluso macro generadores de macros. Así que aquí viene 'cuasiquotación', literalmente 'casi una cita'. Por lo general se parece a la cita quasiquotation normal (pero con otro símbolo cita):

`(defn f [x y] (+ x y)) 

Pero es mucho más potente cosa. En la lista resumida, puede reemplazar elementos arbitrarios con sus valores reales del ámbito externo, obteniendo esencialmente algo así como patrones. Ejemplo:

(let [z 10] `(defn f [x y] (+ x y ~z))) 

valor Aquí son vinculantes 10 a z variable y entonces estamos sustituyéndola dentro quasiquote. Esta expresión produce

'(defn f [x y] (+ x y 10)) 

Este es un ejemplo simple; Los lenguajes Lisp permiten hacer muchas otras cosas útiles con cuasiquotes.

Esta noción se ha transferido a otros lenguajes que admiten la manipulación con árboles de sintaxis. Por ejemplo, la instalación de Haskell aquí es Template Haskell, y es totalmente compatible con cuasiquotación, es decir, crear plantillas y llenarlas con valores del ámbito externo. En lenguajes con sintaxis compleja (como Haskell), las citas cuasi y simples se convierten casi en la única manera sensata de manipular los árboles sintácticos.

UPD: hmm, parece que en Haskell es una característica más sofisticada que la simple sustitución. Quasiquote en Haskell parece un transformador arbitrario y un evaluador de expresiones que puede definir el usuario.

+7

Apareció por primera vez (creo) en lenguajes de programación en Lisp, pero la idea proviene de Quine (quien también introdujo la notación de corchetes), para permitir una forma inequívoca de referirse a lo que representa un símbolo, en lugar de a la símbolo en sí mismo. –

+0

Relacionado con la actualización ... estás hablando sobre: ​​'(hola ~ (+ 1 2)) -> (hola 3)? – jneira

+0

@jneira, No, quise decir que la quasiquotación de Haskell permite definir tipos de datos personalizados a los cuales se resolverá el cuasiquote (ejemplo de lisp continuo, aunque algo artificial, que serían vectores en lugar de listas) y para definir estrategias de análisis personalizadas. Hay un ejemplo en el enlace OP en Haskell Wiki. Por lo tanto, es posible utilizar la característica de quasiquotación para generar árboles de sintaxis arbitrarios, no solo Haskell. –

2

Una cita es solo una cadena literal. Cuasi las citas se "citan" en el sentido de que representan la entrada en algún sentido en lugar de ser código compilado; solo lo representan en una forma que es más fácil de manipular desde el interior del proceso de compilación (un árbol sintáctico abstracto, que puede injertarse de varias formas que son algo más seguras que operar en texto).

19

Estas nociones existen en el lenguaje Lisp y sus variantes.

En estos lenguajes, cada vez que el intérprete ve una lista (a b c ... z), se evalúa que, mediante la aplicación de a a los otros elementos b ... z.

Si desea que una lista no se evalúe (y por lo tanto se interprete como una lista), debe citar. Por ejemplo, '(a b c) se evalúa como una lista con tres elementos, no como a aplicado a b y c. Puede ver la cotización como deteniendo la evaluación.

Ahora cuasiquotation se comporta como una cita, excepto que puede reanudar la evaluación dentro de partes de la lista. Quasiquote con el apóstrofo retrógrado `y permite que ciertas subexpresiones sean sin comillas con el operador de coma (al menos en Scheme, no conozco otras variantes de Lisp). Por ejemplo

`(a ,(b c)) 

evalúa a una lista con dos elementos: a, y el resultado de la evaluación de (b c).

Esto es particularmente útil para crear plantillas, donde se llenan los huecos al desmarcar. Ejemplo (tomado de there):

(define (create-shipping-employee-association name) 
    `((name ,name) 
    (employee-id-no ,(get-next-employee-id!)) 
    (department shipping) 
    (hire-date ,(get-day) ,(get-month) ,(get-year)))) 
5

En Nemerle un cuasi-cita es (http://nemerle.org/metaprogramming.pdf):

"

Meta-lenguaje es un lenguaje para programación tales operaciones lo general, tiene su. propia sintaxis para describir varias construcciones del lenguaje de objetos.

Por ejemplo, en nuestro sistema:

<[ 1 + f (2 * x) ]> 

denota el árbol de sintaxis de la expresión:

1 + f (2 * x) 

Esta idea se llama cuasi-cita.

El prefijo cuasi proviene de la posibilidad de insertar valores de expresiones de metalengua en el contexto citado.

si g(y) es tal expresión, podemos escribir:

<[ 1 + $(g(y)) ]> 

que describe un árbol sintáctico, cuya segunda parte se sustituye por el resultado de evaluación de g(y)

"

2

Básicamente, básicamente significa que puede poner un signo de dólar dentro de la oferta y volver a cambiar al código que no está entre comillas:

<[ WriteLine($(ReadLine())) ]> 

Esto producirá en tiempo de ejecución una cadena ingresada en tiempo de compilación (en realidad no creo que esto funcione e. gramo.en Visual Studio, ya que ReadLine requiere entrada de consola; pero puede leer archivos, red, etc.).

+0

El OP tenía como objetivo el significado en cuanto a la etimología, no lo que significa código. –

Cuestiones relacionadas