3

谁能帮我理解 Scheme 中的各种参数传递模式?我知道 Scheme 实现了按值传递参数。但是其他模式呢?

有没有关于在 Scheme 中传递参数的好文档?

4

2 回答 2

7

Scheme只有按值调用的函数调用。还有其他可以在该语言中实现的替代方案,但如果您是初学者,那么此时最好不要尝试它们。如果您正在寻找一种“通过引用”传递值的方法 - 那么可以使用宏的一个选项是使用宏,但您真的不应该去那里。相反,一些像 PLT Scheme 这样的 Scheme 实现提供了一个“盒子值”:这是一种像这样使用的容器:

  • 你创建一个盒子<something>持有(box <something>)
  • 你得到存储在一个盒子里的值(unbox <some-box>)
  • 您更改存储在框中的值(set-box! <some-box> <new-value>)

鉴于这两个,您可以“按值”使用此类框对象,但它们的内容实际上是一个引用。这与 C 非常相似,其中所有值(实际上大多数)都是按值传递的,但其中一些值可以是您可以改变的指针。顺便说一句,最好避免这些:在 Scheme 中,函数式编程是更常见的选择,因此最好从它开始。

(一旦您对 Scheme 更加熟悉,并且如果您使用的是具有足够抽象的 Scheme,那么您也可以学习如何模仿许多替代方案。)

于 2010-02-21T02:25:20.277 回答
1

要添加更多...

四种基本的参数传递约定是按值调用、按引用调用、按名称调用和按需要调用。Scheme,作为一种“主要功能”的语言,依赖于按值调用;变量一旦创建,通常不会更改。其他三个约定非常相似,您仍然可以在 Scheme 中通过在框中传递您的值(使用 box 和 unbox)来实现它们,并且这些框充当指向值的指针。

通常,如果您发现需要在函数中使用引用调用,您可能应该重新考虑如何实现该函数并使其成为纯函数式。在使用创建变量后修改变量set!是一种“副作用”,通常在函数式编程中避免使用。

于 2010-02-22T18:44:55.797 回答