需要 mercury 中的记录语法示例

Need an example of Record Syntax in mercury

我是 mercury 的新手,我正在努力思考 Record Syntax,但参考手册是我唯一遇到过它的地方,它让我感到困惑:

Term ^ field1(Arg1) ^ field2(Arg2, Arg3) is equivalent to field2(Arg2, Arg3, field1(Arg1, Term)).

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

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

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

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

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

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

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,

当 this 与 状态变量表示法,会出现一个额外的语法糖。

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

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

!: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