有没有办法在 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
的这种特殊行为使他们能够做到这一点。
我正在使用 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
的这种特殊行为使他们能够做到这一点。