2016-07-28 8 views
2

Ich versuche, eine einfache Web-App im Racket zu bookmarken.Bewerten von Variablen in Racket Antwort/xexpr

Es soll eine URL als CGI-Argument erhalten, und im Moment versuche ich nur zu bestätigen, dass ich es erhalten habe, indem ich es zurückreflektiere.

(define (start request) 
    (response/xexpr 
    (let* ([bindings (request-bindings request)] 
      [url (if (exists-binding? 'url bindings) 
        (extract-binding/single 'url bindings) 
        "NO URL")]) 
    `(html 
     (head (title "TITLE")) 
     (body (h2 "TITLE")    
      (p "URL = " url))  
      )))) 

Doch statt zu sehen, was ich .. erwarten zu sehen, die eine Seite, die

URL = http://google.com 

enthält Ich bin

URL = &url; 

sehen, welche die URL schlägt zitiert wird wörtlich im xexpr (behandelt als eine Entität), anstatt als eine Variable ausgewertet zu werden.

Also, was mache ich falsch? Wie erhalte ich eine URL?

Antwort

5

Sie benötigen quasiquote und unquote verwenden, um Werte in einem zitierte experession zu injizieren, häufiger als ihre Leser Abkürzung Äquivalente gesehen, ` bzw. ,. Wenn Sie unquote/, innerhalb von quasiquote/` verwenden, wird es den Ausdruck auszuwerten und in die umgebende Zitat einfügen:

> (define url "http://google.com") 
> `(p "URL = " ,url) 
(p "URL = " "http://google.com") 

Sie , vor url in der Vorlage es unquote setzen sollte.

Für eine detaillierte Erklärung des Angebots und der Quasiquotation, siehe Appendix A of this answer.

+0

OK Ich verpasste die, ich dachte, der Backtick am Anfang des Ausdrucks war ausreichend, um Variablen als solche ausgewertet zu haben. Vielen Dank. – interstar