任何人都可以帮我理解Scheme中的各种参数传递模式吗?我知道Scheme实现了值的参数传递。但其他模式呢?
在Scheme中传递参数有什么好的文档吗?
答案 0 :(得分:7)
Scheme只有 值调用函数调用。还有其他替代方案可以在语言中实现,但如果你是初学者,那么最好不要在这一点上尝试它们。如果你正在寻找一种通过“引用”传递值的方法 - 那么可以使用的一种选择就是使用宏,但你真的不应该去那里。相反,像PLT Scheme这样的一些Scheme实现提供了一个“盒子值”:这是一种像这样使用的容器:
<something>
(box <something>)
的框
(unbox <some-box>)
(set-box! <some-box> <new-value>)
鉴于这两个,你可以“按值”使用这样的盒子对象,但它们的内容实际上是一个引用。这非常像C,其中所有值(实际上大多数)都是按值传递的,但是这些值中的一些可以是可以变异的指针。顺便说一句,最好避免这些:在Scheme中,函数式编程是更常见的选择,因此最好从那开始。
(一旦你对Scheme更加流利,如果你正在使用一个有足够抽象的Scheme,那么你也可以学习如何模仿很多替代方案。)
答案 1 :(得分:1)
再添加一点......
四个基本的参数传递约定是按值调用,按引用调用,按名称调用和按需调用。 Scheme作为一种“功能最强大”的语言,依赖于按值调用;变量一旦创建,通常不会更改。其他三个约定非常相似,您仍然可以通过在框中传递值(使用box和unbox)在Scheme中执行它们,并且这些框充当值的指针。
通常,如果您发现需要在函数中使用call-by-reference,您可能应该重新思考如何实现该函数并使其纯粹起作用。在使用set!
创建变量之后修改变量是一种“副作用”,通常在函数式编程中避免使用。