【问题标题】:Can we get the reference denoted by a variable in SML?我们可以得到 SML 中变量表示的引用吗?
【发布时间】:2020-08-06 16:54:20
【问题描述】:

在 SML 中,通过引用考虑副作用。

  • 任何变量(无论是否使用副作用)表示一个引用然后引用一个值是否正确?

  • 是否可以获得由变量表示的引用? C 中是否有类似& 的操作用于相同目的? (在 SML 中,默认情况下,作为表达式的变量不是对变量表示的引用进行评估,而是对变量表示的引用所引用的值进行评估。)

  • 引用可以是评估表达式的结果吗?

谢谢。

【问题讨论】:

    标签: programming-languages sml ml


    【解决方案1】:

    您的第一个问题并不完全清楚。并非 SML 中的所有值都是 ref 类型。在val a = 3 中,名称a 绑定到int 而不是int ref 类型。所以从这个意义上说,答案只是“否”,并非 SML 中的所有值都是引用,大多数都不是。另一方面,如果 SML 实现在后台使用引用来管理名称到值的绑定,这有点涉及实现问题。

    对于您的其他两个问题,给定 SML 中的任何类型 'a,都有一个相关的引用类型 'a ref。您可以创建这种类型的值并将它们分配给变量。给定一个ref 类型的值,您可以取消引用它(使用运算符!)以获取它所引用的值(否则它会有点无用),并且您可以从函数返回引用类型。事实上函数ref 是一个返回引用类型的多态函数。见sml - Usage of the ref function

    SML 没有像 C 中的 & 这样的地址运算符,但可以使用引用类型来引用名称所绑定的值。

    给定

    val a = 4
    val b = ref(3)
    

    b 现在是int ref。可以使b 引用a 绑定到的值:

    b := a
    

    现在!b 的计算结果为4。所以从这个意义上讲,:= 类似于 C 中的 = &,但是如果在后台 b 指向与存储 a 的值相同的内存位置,或者如果该值已复制到 b 已经指向的位置。

    【讨论】:

    • 谢谢。我的第二个问题是:是否可以获得由变量表示的引用?是否有类似 C 中的 & 用于相同目的的操作?
    • @Tim 我编辑了这个问题。我想你可能想知道 C 中的 p = &x; 对应的是什么。最接近的匹配是 p := x,但这并不意味着语义完全相同,
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-08-07
    • 2016-06-22
    • 1970-01-01
    • 1970-01-01
    • 2013-03-25
    • 2023-03-24
    相关资源
    最近更新 更多