1
36
我找到了一个很好的解释 Pass-By-Name Parameter Passing . 从本质上讲,函数体在将实际参数替换为函数体后,在调用时进行解释。在这个意义上,计算方法类似于C预处理器宏。
通过将实际参数代入函数体,函数体可以读写给定的参数。在这个意义上,评估方法类似于参照传递。不同之处在于,由于使用pass-by名称,参数是
评价的
在函数内部,一个参数,如
上面我链接的页面有更多的例子,其中pass-by-name既有用又危险。今天,由pass-by-name实现的技术在很大程度上被其他更安全的技术(如pass-by-reference和lambda函数)所取代。 |
2
13
我假设你的意思是用algol 60来命名。 按名称调用类似于按引用调用,因为您可以更改传入参数的值。它不同于按引用调用,因为参数是 不 在调用过程之前对其进行了计算,但改为延迟计算。也就是说,只有在实际使用参数时才对其进行评估。
例如,假设我们有一个过程
在许多方面,这看起来像是参数的文本替换(通过重命名来避免名称冲突)。然而,在实践中,这是通过对传入表达式使用“thunk”(基本上是闭包)来实现的。 维基百科关于 Jensen's Device 显示了一些使用按名称调用的有趣示例。以下是其中之一:
|
3
3
对于未来的人: 编程语言中的概念 约翰·C·米切尔也很有帮助。
|
4
1
Flatlander有一个很有启发性的例子,说明它在scala中的工作方式。 here . 假设您想要实现 虽然 :
scala不是algol 60,但它可能会发光。 |
5
1
您可以以变量的符号形式传递“name”,它允许同时更新和访问变量。例如,假设您希望将int类型的变量x三倍化:
|
6
1
算法是为数学算法而设计的。我喜欢使用求和函数作为按名称调用的示例。 对不起,我的算法有点生疏。语法可能不对。
你不能用和
在上面,内部和(y,3,8,x+y)将生成一个未命名的函数来传递给外部和调用。变量x和y不是按值传递的,而是按名称传递的。在变量的情况下,按名称调用等价于C中的按地址引用调用。当涉及递归时,它会变得有点混乱。 借来的人制造海藻机。他们有48位字存储器和3个标志位。标志位按algol的名称实现了cal。它是一个堆栈机器,因此当函数加载到堆栈上时,名为fag的调用将导致调用它。当表达式用作参数时,编译器将生成未命名的函数。变量是一个简单的间接引用。写入函数时会出错。 |
7
1
事实上,顾名思义,不仅仅是一种历史的好奇心。您可以在Windows批处理文件(以及无数其他脚本语言)中按名称调用。知道它是如何工作的,以及如何在编程中有效地使用它,可以为解决问题打开一个整洁的解决方案。我知道它只是为以后的扩展传递字符串,但是它可以被操纵以产生与按名称调用类似的效果。
|
8
1
我知道我加入俱乐部晚了,这不一定是个答案,但我确实想补充一点,可以帮助澄清一点。我一直把Algol的名字看作是一个类似的过程,当C++预处理器指令(宏,特别是)在编译时用一段代码替换一些函数/变量的名称时。pass-by名称实质上用实际参数替换形式参数的名称,然后执行。我从来没有在Algol写过,但是我听说通过的名字和C++的通过引用会得到相同的结果。 |
John · 如何读取C中函数的参数字符串? 6 年前 |
sid_com · Perl 6:如何检查“new”中的无效参数? 6 年前 |
Gamma · 如何将提升窗体的QSPINBOKS值传递到主窗口 6 年前 |
Matthias · Python:类型化方法参数 6 年前 |