【问题标题】:Example of Call by name姓名呼叫示例
【发布时间】:2010-07-25 21:43:34
【问题描述】:

在我的编程课原则中,我们谈论的是不同的调用方法。我们讨论的一些是:

  • 按值调用
  • 引用调用
  • 按值/结果调用
  • 按姓名呼叫

我找不到按名称调用如何工作的示例。有人愿意给我举个例子吗?我认为当您将 xml 文件作为输入时,这与按名称调用的 相似。有人能给我一个更传统的例子吗?

【问题讨论】:

  • 我不知道任何现代的名字调用示例。在 ALGOL 60 中这是一个非常糟糕的主意,我怀疑这已经改变了。
  • 您在寻找什么样的例子?使用名称调用的语言示例或使用名称调用评估表达式的示例?
  • @sepp2k,两者都可能有用。我不确定,但从我目前的理解来看,这似乎是一个非常死板的想法(如果我错了,请纠正我)但它包含在课程材料中(可能只是出于历史原因?)

标签: theory callbyname


【解决方案1】:

我将使用一种假设的编程语言。假设我们有一个函数 p(x) 打印出 x 然后返回它。现在让我们定义一个函数:

function foo(x, y) { return y+1; }

现在让我们用一些参数来调用它:

foo(p(123),p(456))

xy 将被替换为参数,因此上面对 foo 的调用将导致:

return p(456)+1;

所以我们要将 456 打印到屏幕上并返回 457。在另一种评估策略中,我们将首先评估函数参数(在此过程中将 123 和 456 打印到屏幕上),然后用 456 替换 y在函数体中,最终返回 457。

这是人为的,但我希望你明白这一点。一切都是为了替代。

【讨论】:

  • 那么按名称调用也会按引用调用吗?价值?有什么具体的吗?
  • @sixtyfootersdude,这句话让我的大脑受伤了。想重申一下吗?
  • 当然。假设你有这个(按名称调用):int x = 0; foo(t(x)); print(x); 如果它是 also “按值调用”,这将打印 0。如果它是 also “通过引用调用”它可以打印其他内容。
  • 吉安!回来回答他!
  • 我仍然相当肯定我不明白这个问题。在按引用调用的场景中,被引用的值总是有可能被修改,因此名称传递的预期语义不太经得起审查。除此之外,我仍然不确定要问什么。
【解决方案2】:

http://en.wikipedia.org/wiki/Evaluation_strategy#Call_by_name

在按值调用中,您评估参数,检索然后传递给函数的值。 foo(bar()) 被评估为 arg = bar();,然后调用 foo(arg),在函数体中,这个新分配的 arg 变量是可访问的、可修改的,...

在按名称调用中,您在函数体中用调用期间使用的代码替换对参数的任何引用。然后,评估主体,您将评估论点。 foo(bar())foo(arg) { return arg; } 将被评估为 foo(arg) { return bar(); }

【讨论】:

    【解决方案3】:

    按名称调用在实参为scaler时与按引用调用相同,但在实参为表达式或数组 然后在每次访问时重新计算实际参数。

    这是一个简单的例子

    begin
        integer n;
        procedure p(k: integer);
            begin
            print(k);
            n := n+1;
            print(k);
            end;
        n := 0;
        p(n+10);
        end;
    
    • 按值调用输出 => 10 10
    • 按名称调用输出 => 10 11

    【讨论】:

    • 我在别处看到了这个例子,你应该引用
    猜你喜欢
    • 2021-03-26
    • 2020-07-26
    • 2012-01-31
    • 1970-01-01
    • 1970-01-01
    • 2012-06-30
    • 1970-01-01
    • 2012-08-19
    • 2011-02-27
    相关资源
    最近更新 更多