评估Racket响应/ xexpr中的变量

int*_*tar 3 racket

我正在尝试在Racket中制作一个简单的书签web应用程序.

这意味着收到一个网址作为CGI参数,而现在,我只是想通过反映它来确认我收到它.

(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))    
           ))))
Run Code Online (Sandbox Code Playgroud)

但是,而不是看到我期望看到的...这是一个包含的页面

URL = http://google.com
Run Code Online (Sandbox Code Playgroud)

我正在看

URL = &url;
Run Code Online (Sandbox Code Playgroud)

这表明url在xexpr中被字面引用(被视为实体),而不是被评估为变量.

那么我做错了什么?如何评估网址?

Ale*_*ing 5

您需要使用quasiquoteunquote将值注入引用的扩展,更常见的是它们的读者缩写等价物,`并且,分别.当您使用unquote/ ,quasiquote/ `,它会计算表达式,并将其插入到周围的报价:

> (define url "http://google.com")
> `(p "URL = " ,url)
(p "URL = " "http://google.com")
Run Code Online (Sandbox Code Playgroud)

您应该放在模板,前面url以取消引用它.

对于报价和quasiquotation的更详细的解释,看到这个答案的附录A中.