【问题标题】:Pass by name and pass by value-result languages按名称传递和按值结果语言传递
【发布时间】:2009-04-05 00:45:24
【问题描述】:

对于我的编程语言课程,我正在尝试用使用名称传递或值结果传递的语言编写一些代码 sn-ps,最好是默认情况下,但任何支持其中任何一种的语言都可以.但是,我还没有找到支持其中任何一种的单一语言。有谁知道使用按值结果传递或按名称传递的语言?最好是命令式语言。

【问题讨论】:

    标签: programming-languages parameter-passing


    【解决方案1】:

    wikipedia article on evaluation strategy 表明 fortran 支持按值调用结果。 algol 68 支持按名称调用。

    【讨论】:

    • 谢谢,我想我要走这条路了。
    • Algol 60 具有按值调用和按名称调用; Algol 68 具有 call-by-value 和 call-by-reference,程序员可以手动采用 call-by-copy-restore 方法。共享调用看起来有点像引用调用(以“过程”的形式),但我不确定它们在 Algol68 中是否真的相同。 Algol68 的第一个版本有按需调用,但在 Rev1 中被删除;
    【解决方案2】:

    我认为 C 宏是按名称传递的(当然,不是 C 语言本身)。恐怕我不知道任何按值结果传递的语言(老实说,我必须进行网络搜索才能找出它的含义!)。

    【讨论】:

    • 我不确定 C 宏是否适合我正在尝试做的事情,但这是一个有趣的想法,非常感谢。
    【解决方案3】:

    如果你将一个变量传递给一个fortran函数并在那里修改它,你也在调用程序中修改它:

    伪代码:

    int j = 1
    print j
    addOne(j)
    print j
    

    会输出:

    1
    2
    

    【讨论】:

    • 我总是被(真正的)旧版 Fortran 逗乐,它可以让您调用 addOne(1) 并修改常量 1 的值。
    【解决方案4】:

    我认为 CLIPS 专家系统语言会按名称传递。

    【讨论】:

      【解决方案5】:

      Java 和 C 都是按值传递的语言。

      C 显然是一种按值传递的语言。

      Java 总是被告知“基元通过值传递,对象通过引用传递”。但是由于java对象在任何时候都是一个引用,所以它实际上是一个引用值。

      Java 语言规范说明了这一点: http://java.sun.com/docs/books/jls/second_edition/html/classes.doc.html#37472

      【讨论】:

        【解决方案6】:

        Algol 支持 pass-by-name,你可以找到一些解释 here

        有人告诉我 Ada 支持按值/结果传递,但还没有尝试过。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2017-03-27
          • 2017-01-19
          • 2014-04-14
          • 2021-06-01
          相关资源
          最近更新 更多