我正在使用Racket教授(功能性)编程,我真的很喜欢为初学者禁用功能的方式。然而,我对Racket的一个问题是,即使在最受限制的版本中,功能似乎也会被提升。现在有没有办法在球拍中禁用功能提升,以便下面的代码会产生错误?
(define (f x)
(g x)
)
(check-expect (f 3) 3)
(define (g x)
x
)
答案 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
的这种特殊行为允许他们这样做。