4

我是水星新手,我正试图围绕Record Syntax来思考,但参考手册是我遇到它的唯一地方,它让我感到困惑:

项 ^ field1(Arg1) ^ field2(Arg2, Arg3) 等价于 field2(Arg2, Arg3, field1(Arg1, Term))。

有人可以帮忙举一个真实的例子吗?

4

1 回答 1

4

记录语法是一种语法糖,手册试图解释从记录语法到 Mercury 正常语法的转换是如何工作的。如果您想了解如何实现记录语法,这很好,但如果您想学习如何使用它,这不是很有帮助。

我建议忽略括号中的 (Arg1, ...) 东西——我不确定它是否真的是语法的一部分,而且我从未见过有人使用它。

让我们创建一个表示笛卡尔平面上的点的结构。

:- type point
    --->    point(
                pt_x        :: int,
                pt_y        :: int
            ).

pt_x 和 pt_y 是字段名称,它们允许我们检索点字段的值。例如:

format("The point's X coordinate is: %d\n", [i(Point ^ pt_x)], !IO),
format("The point's Y coordinate is: %d\n", [i(Point ^ pt_y)], !IO),

我们可以检索一个值并将其分配给一个新变量。

X = Point ^ pt_x,

而且我们还可以更新一个字段,而不必再次写出整个点。

NewPoint = OldPoint ^ pt_y := NewY,

事情变得有点复杂的地方是当它与状态变量表示法一起使用时,会出现一个额外的语法糖。

move_up(D, !Point) :-
    NewY = !.Point ^ pt_y + D,
    !Point ^ pt_y := NewY.

请注意,当我们读取一个值时,我们使用 !.Point,它是“当前值”的状态变量。当我们更新它时,我们可以这样写:

!:Point = !.Point ^ pt_y := NewY.

然而,这个额外的语法糖允许我们编写:

!Point ^ pt_y := NewY.

我希望这有帮助。Mercury 源代码中还有更多示例:

https://github.com/Mercury-Language/mercury

和其他 Mercury 项目,请注意 github 语言标记已损坏,许多 Objective-C 文件被检测为 Mercury 并且许多 Mercury 的东西被检测为其他文件:

https://github.com/search?utf8=%E2%9C%93&q=language%3AMercury&type=Repositories&ref=advsearch&l=Mercury

于 2015-09-01T00:34:57.437 回答