我正在尝试在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中被字面引用(被视为实体),而不是被评估为变量.
那么我做错了什么?如何评估网址?
您需要使用quasiquote和unquote将值注入引用的扩展,更常见的是它们的读者缩写等价物,`并且,分别.当您使用unquote/ ,内quasiquote/ `,它会计算表达式,并将其插入到周围的报价:
> (define url "http://google.com")
> `(p "URL = " ,url)
(p "URL = " "http://google.com")
Run Code Online (Sandbox Code Playgroud)
您应该放在模板,前面url以取消引用它.
对于报价和quasiquotation的更详细的解释,看到这个答案的附录A中.