计划“承诺?” Racket 博士,geiser

scheme `promise?` Dr Racket, geiser

Welcome to DrRacket, version 6.0 [3m].
Language: racket; memory limit: 128 MB.
> promise?
#<procedure:promise?>
> (promise? (delay (+ 1 2)))
#t

我需要使用 R5RS 并且正在处理延迟评估...这里在 emacs 中使用 geiser:

racket@> (require r5rs)
racket@> (cons 1 '())
(mcons 1 '()) ;; this is how racket represents a r5rs cons
racket@> (define x (delay (+ 1 2)))
racket@> x
#<promise>
racket@> (promise? x)
#f ;; what is going on here???
racket@> promise?
#<procedure:promise?>

当然上面的代码 (promise? x) 应该 return #t... 我注意到当我在 DrRacket (gui) 中切换到 R5rS 时,出现以下错误。有人可以解释发生了什么吗?我认为 promise? 是为 R5RS 定义的。还是我记错了?

Welcome to DrRacket, version 6.0 [3m].
Language: R5RS; memory limit: 128 MB.
> promise?
. . promise?: undefined;
 cannot reference undefined identifier
> 

R5RS中没有promise?。构造 delay 产生一个表示承诺的值,但由实现者决定如何表示承诺。一些实现选择将它们表示为闭包。 Racket 中的 R5RS 实现选择使用名称为 promise? 的结构。这就是为什么您看到 promise 值打印为 #<promise>.

我怀疑 R6RS 也有类似的情况。