2013-06-02 9 views
5

(car ''abracadabra) entspricht (car (quote (quote abracadabra)), und es wertet zu (car (quote abracadabra)) ->quoteWann bewertet das Schema das Angebot?

Auf der othe Hand (car (quote (a b))) zu a auswertet, das Gefühl intuitiv zu mir macht.

Also meine Frage ist, warum Schema das zweite Zitat in (car (quote (quote abracadabra)) (d bewerten (car (quote abracadabra))-(car abracadabra)) nicht bewerten, aber das Zitat in (car (quote (a b))) hat evaluade (das heißt, warum ist nicht die Antwort quote)?

Antwort

9

In diesem Ausdruck:

(car (quote (quote abracadabra))) 
=> 'quote 

Die inneren quote nicht ausgewertet bekommt, es ist nur ein Symbol , ohne besondere Bedeutung. Man könnte es auch für etwas ändern sonst, mit dem gleichen Ergebnis:

(car (quote (foobar abracadabra))) 
=> 'foobar 

Innerhalb eines zitierte Ausdruck, werden andere Ausdrücke nicht ausgewertet bekommen. Wir konnten quasiquoting verwenden, um Auswertung zu erzwingen, jetzt dies wird versuchen, das innere Zitat zu bewerten, für jeden Fall in einem anderen Fehler führt:

(car (quasiquote (unquote (quote abracadabra)))) ; (car `,(quote abracadabra)) 
=> car: contract violation expected: pair? given: 'abracadabra 

(car (quasiquote (unquote (foobar abracadabra)))) ; (car `,(foobar abracadabra)) 
=> foobar: unbound identifier in module in: foobar 
2

Scheme wertet das innere Zitat nicht aus, da das innere Zitat innerhalb des äußeren Zitats liegt und Ausdrücke innerhalb eines Zitats nicht ausgewertet werden. Das heißt, wenn Sie (quote foo) schreiben, wird foo niemals ausgewertet - auch wenn foo ein weiterer Anruf an quote ist.

1

Wenn Schema eine Kombination wertet sie den Bediener auswertet. Dann wird es angewendet, wenn es ein spezielles Formular oder Makro ist. Wenn nicht, wird jeder Operand vor der Anwendung ausgewertet.

(car (quote (quote abracadabra))) 

Kann *

  • Auto ausgewertet <> proc Auto # wie diese ausgewertet werden. da es ein Verfahren ist die Bewertung aller Operanden in beliebiger Reihenfolge
  • (Zitat (Zitat Abrakadabra)) ist eine Kombination, so
    • Zitat ausgewertet => # < Makro quote> und seit seiner einem Makro/spezielle Form tun Makro- gelten
    • apply-Makro (# < Makro quote> (Zitat Abrakadabra))) => (Zitat Abrakadabra)
  • apply-proc (# < proc Auto> (Zitat Abrakadabra)) => quote

* Eigentlich kann Schema jedes Keyword überschatten, daher ist der Kontext sehr wichtig. Zum Beispiel:

(let ((quote list) (abracadabra 'simsalabim)) 
    (car (quote (quote abracadabra)))) 
==> (simsalabim)