有没有办法在 Racket 中禁用功能提升?

Is there a way to disable function-hoisting in Racket?

我正在使用 Racket 教授(函数式)编程,我真的很喜欢为初学者禁用功能的方式。然而,我在使用 Racket 时遇到的一个问题是,即使在最受限制的版本中,功能似乎也被提升了。现在有没有一种方法可以禁用球拍中的函数提升,以便以下代码产生错误?

(define (f x)
  (g x)
)

(check-expect (f 3) 3)

(define (g x)
  x
)

此行为不是由提升函数引起的。这是由 check-expect 引起的。您可以将 check-expect 视为 "hoisted downwards."

如果用你自己的函数替换check-expect,你会得到正常的错误:

g is used here before its definition

对于程序:

(define (my-check-expect actual expected) ....)

(define (f x)
  (g x))

(my-check-expect (f 3) 3)

(define (g x)
  x)

如果您希望学生在编码后只编写测试,您可以制作一个提供新版本 check-expect 的教学包。

但是,这是个坏主意。 Design Recipe 教学生在编码之前编写功能 examples/tests。 check-expect 的这种特殊行为使他们能够做到这一点。