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

时间:2017-11-12 16:21:30

标签: racket hoisting

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

(define (f x)
  (g x)
)

(check-expect (f 3) 3)

(define (g x)
  x
)

1 个答案:

答案 0 :(得分:2)

此行为不是由提升功能引起的。它是由check-expect引起的。您可以将check-expect视为“向下悬挂”。

如果用自己的函数替换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教导学生在编写代码之前编写功能示例/测试。 check-expect的这种特殊行为允许他们这样做。