【发布时间】:2015-03-17 12:41:39
【问题描述】:
我正在尝试理解与 Racket Web 框架教程 http://docs.racket-lang.org/continue/ 中的发送/暂停/调度代码相关的示例。
为了方便起见,这里是让我困惑的代码:
#lang web-server/insta
; start: request -> response
(define (start request)
(show-counter 0 request))
; show-counter: number request -> doesn't return
; Displays a number that's hyperlinked: when the link is pressed,
; returns a new page with the incremented number.
(define (show-counter n request)
(local [(define (response-generator embed/url)
(response/xexpr
`(html (head (title "Counting example"))
(body
(a ((href ,(embed/url next-number-handler)))
,(number->string n))))))
(define (next-number-handler request)
(show-counter (+ n 1) request))]
(send/suspend/dispatch response-generator)))
我有两个问题:
(最重要的)embed/url 定义在哪里?我看不出它是在这段代码中定义的,但我对延续的理解是基本的,所以我可能遗漏了一些东西。
本地化的目的是什么?我可以删除它,代码似乎也能正常工作。
【问题讨论】:
-
在某些用于 Racket 内部定义的#langs 中是不允许的。所以使用
local。它类似于let。 -
正如 Rptx 所写,在这种情况下 local 可以省略。很明显,response-generator 是一个本地函数(因此它可以关闭值 n 和 request。