2013-06-02 13 views
5

(car ''abracadabra) è equivalente a (car (quote (quote abracadabra)), e si valuta a (car (quote abracadabra)) ->quoteQuando lo schema valuta la citazione?

Sulla mano Othe (car (quote (a b))) viene valutato come a, che per me ha un senso intuitivo.

Quindi la mia domanda è, perché Scheme non valuta la seconda citazione in (car (quote (quote abracadabra)) (cioè valutare (car (quote abracadabra))-(car abracadabra)), ma fa evaluade la citazione in (car (quote (a b))) (vale a dire il motivo per cui non è la risposta quote)?

risposta

9

In questa espressione:

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

L'interno quote non ottiene valutata, è solo un simbolo , senza alcun significato particolare. Si potrebbe anche cambiarlo per qualsiasi altra cosa, con gli stessi risultati:

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

All'interno di un'espressione citata, altre espressioni non avranno valutato. Potremmo usare quasiquoting per forzare la valutazione, ora questo tenterà di valutare la citazione interno, causando un errore diverso per ciascun caso:

(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

Schema non valuta la citazione interna perché la citazione interna è all'interno della citazione esterna e le espressioni all'interno di una citazione non vengono valutate. Cioè se scrivi (quote foo), allora foo non sarà mai valutato - anche se foo è un'altra chiamata a quote.

1

Quando regime valuta una combinazione valuta l'operatore. Quindi si applica se si tratta di una forma speciale o di una macro. In caso contrario, valuterà ogni operando prima dell'applicazione.

(car (quote (quote abracadabra))) 

possono essere valutati come questo *

  • auto restituisce # < auto proc>. dal momento che si tratta di una procedura di valutazione di tutti gli operandi in qualsiasi ordine
  • (citazione (citazione abracadabra)) è una combinazione, quindi
    • citazione viene valutata => # < macro quote> e sin dalla sua una macro/forma speciale fare macro- applicare
    • applicare-macro (# < macro quote> (citazione abracadabra))) => (citazione abracadabra)
  • applicare-proc (# < auto proc> (citazione abracadabra)) => citazione

* In realtà Scheme può ombreggiare qualsiasi parola chiave in modo che il contesto sia molto importante. Es .:

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