Antwort

40

Ich glaube, dass dieser Begriff von Lisp Sprachen kommt.

Programm in Lisp geschrieben besteht aus Reihe von Listen von Listen von Listen usw., wie folgt aus:

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

Wegen solcher Einheitlichkeit es möglich ist, einen solchen Code als Daten darzustellen und zu manipulieren, so dass die Folge von Zeichen oben wird als wörtliche Liste interpretiert. Dies ist eine sehr nützliche Funktion von Lisps, einer ihrer Besonderheiten. Aus praktischen Gründen können Lisp-Sprachen sinnvolle Sequenzen "zitieren", indem sie sie aus Definitionen und Ausdrücken in Listen umwandeln. Es sieht wie folgt aus:

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

In diesem Fall ist es eine wörtliche Liste enthalten ist, direkt für Destrukturierung mit Analoga von Haskell head und tail und andere Methoden. "Zitat" bedeutet also "einen Literalwert aus der Liste machen".

Es ist jedoch nicht bequem, Listen direkt mit head - und tail ähnlichen Funktionen zu bearbeiten. Es wird bemerkenswert, wenn Sie beginnen, komplexe Makros oder sogar makrogenerierende Makros zu schreiben. Also hier kommt 'Quasiquotation', wörtlich 'fast ein Zitat'. Normalerweise sieht quasiquotation wie plain quotiert (aber mit einem anderen Zitat Symbol):

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

Aber es ist viel mächtige Sache. In der quasiquoted-Liste können Sie beliebige Elemente durch ihre tatsächlichen Werte aus dem äußeren Bereich ersetzen, im Wesentlichen erhalten Sie so etwas wie Muster. Beispiel:

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

Hier sind wir Bindungswert zu 10z variable und es dann im Inneren quasiquote wir ersetzen. Dieser Ausdruck liefert

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

Dies ist ein einfaches Beispiel; Lisp-Sprachen ermöglichen viele andere nützliche Dinge mit Quasiquoten.

Dieser Begriff wurde auf andere Sprachen übertragen, die die Manipulation mit Syntaxbäumen unterstützen. Zum Beispiel ist die Haskell-Einrichtung hier Template Haskell und unterstützt vollständig die Quasiquotation, d. H. Das Erstellen von Templates und das Ausfüllen von Werten aus dem äußeren Bereich. In Sprachen mit komplexer Syntax (wie Haskell) werden Quasi- und Plain-Zitate fast zur einzigen sinnvollen Möglichkeit, Syntaxbäume zu manipulieren.

UPD: hmm, es scheint, dass in Haskell es ausgeklügelter als einfache Substitution ist. Quasiquote in Haskell sieht wie ein willkürlicher Transformator und Evaluator von Ausdrücken aus, die vom Benutzer definiert werden können.

+7

Es erschien zuerst (glaube ich) in Programmiersprachen in Lisp, aber die Idee stammt von Quine (die auch die Square-Bracket-Notation für sie einführte), um einen eindeutigen Weg zu ermöglichen, auf das, was ein Symbol darstellt, statt auf die Symbol selbst. –

+0

Bezogen auf das Update ... reden Sie über: '(hola ~ (+ 1 2)) -> (hola 3)? – jneira

+0

@jneira, Nein, ich meine, dass die Haskell-Quasiquotation erlaubt, benutzerdefinierte Datentypen zu definieren, auf die das Quasi-Wort aufbaut (weiterführendes Lisp-Beispiel, obwohl etwas künstlich, das wären Vektoren anstelle von Listen) und benutzerdefinierte Parsing-Strategien zu definieren. Es gibt ein Beispiel in OP Link auf Haskell Wiki. Daher ist es möglich, Quasiquotation-Feature zu verwenden, um beliebige Syntaxbäume zu generieren, nicht nur Haskell. –

2

Ein Zitat ist nur ein String-Literal. Quasi Zitate sind "zitiert" in dem Sinne, dass sie die Eingabe in einem gewissen Sinne darstellen, anstatt kompiliert zu werden; Sie stellen es nur in einer Form dar, die einfacher aus dem Compilierungsprozess heraus manipuliert werden kann (ein abstrakter Syntaxbaum, den Sie auf verschiedene Arten einpfropfen können, die etwas sicherer sind als das Arbeiten mit Text).

19

Diese Begriffe existieren in der Lisp-Sprache und ihren Varianten.

In diesen Sprachen, wenn der Dolmetscher eine Liste sieht (a b c ... z), es wertet es, durch a zu den anderen Elementen b ... z Anwendung.

Wenn Sie möchten, dass eine Liste nicht ausgewertet wird (und damit als Liste interpretiert wird), müssen Sie angeben. Zum Beispiel wird '(a b c) als eine Liste mit drei Elementen ausgewertet, nicht als a angewendet auf b und c. Sie können das Angebot als stoppen Bewertung.

Jetzt verhält sich Quasiquotation wie Zitat, außer dass Sie die Auswertung innerhalb von Teilen der Liste fortsetzen können. Sie quasiquoten mit dem Rückwärts-Apostroph und erlauben, dass bestimmte Teilausdrücke nicht mit dem Komma-Operator quotquit sind (zumindest in Schema, weiß ich nicht über andere Lisp-Varianten). Zum Beispiel

`(a ,(b c)) 

auswertet, um eine Liste mit zwei Elementen: a, und das Ergebnis der Auswertung von (b c).

Dies ist besonders nützlich, um Vorlagen zu erstellen, wo Sie Löcher füllen, indem Sie nicht quotieren. Beispiel (aus 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

In Nemerle ein quasi-Zitat ist (http://nemerle.org/metaprogramming.pdf):

"

Meta-Sprache ist eine Sprache für die Programmierung solcher Operationen Es hat in der Regel seine. eigene Syntax zur Beschreibung verschiedener Konstrukte der Objektsprache

Zum Beispiel in unserem System:

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

bezeichnet den Syntaxbaum des Ausdrucks:

1 + f (2 * x) 

Diese Idee wird quasi-quotation genannt.

Das Präfix Quasi kommt von der Möglichkeit, Werte von Meta-Sprache Ausdrücke in den zitierten Kontext einzufügen.

wenn g(y) ein solcher Ausdruck ist, können wir schreiben:

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

die einen Syntaxbaum beschreibt, dessen zweiter Teil durch das Ergebnis der Auswertung von g(y)

ersetzt wird "

2

Quasi bedeutet im Grunde genommen, dass Sie ein Dollarzeichen in das Angebot einfügen können und dann wieder zum nicht-zitierten Code wechseln können:

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

Dies wird zur Laufzeit eine Zeichenfolge ausgeben, die in der Kompilierzeit eingegeben wurde (eigentlich glaube ich nicht, dass dies funktioniert. E. G.in Visual Studio, da ReadLine eine Konsoleneingabe benötigt; aber Sie können aus Dateien lesen, Netzwerk usw.).

+0

Das OP zielte auf die Etymologie, nicht was es Code bedeutet. –