Racket中的参数有什么用?

JRR*_*JRR 6 racket

我正在尝试了解 Racket 中单线程程序的参数,我在这里阅读了相关信息。也就是说,我仍然不明白为什么它对单线程程序有用。为什么有用?我应该将其视为实现全局变量的一种方式吗?

soe*_*ard 9

Racket 参数可用于提供动态范围(而不是通常的词法范围)。它还提供线程本地存储。

如果 Racket 没有参数,那么我敢肯定,更多的程序会使用全局变量。

作为用例的一个例子,考虑一个绘制点、线、矩形等的程序。每个形状都有一个绘制形状的函数。用户当然希望控制用于绘制形状的颜色。一种选择是让所有函数都有一个color参数作为输入。很快就会意识到,大多数情况下,人们使用相同的颜色绘制许多形状 - 因此,不是所有函数都采用额外的参数,而是希望将当前颜色存储在绘制函数的“外部”。

我们可以将当前颜色存储在一个全局变量中,但是我们需要考虑如果我们设置当前颜色,调用一个辅助函数,并继续绘制会发生什么。helper 函数可能会改变当前的颜色,所以在调用 helper 之前,我们需要存储旧值,之后我们需要恢复值。

使用参数更容易,因为parameterize表单会在正确的时间将临时更改的绑定恢复到原始绑定。

作为旁注参数在存在延续的情况下正常工作,可用于跳回到计算的某个中间部分。

这里有对动态范围的解释:

https://en.wikipedia.org/wiki/Scope_(computer_science)#Dynamic_scoping

Guide 中参数的最后一部分总结了参数相对于全局变量的优势:

https://docs.racket-lang.org/guide/parameterize.html