需要一个水银记录语法的例子

时间:2015-08-31 05:04:04

标签: mercury

我是水银的新手,我正试图绕过Record Syntax,但参考手册是我遇到它的唯一地方,让我感到神秘:

  

术语^ field1(Arg1)^ field2(Arg2,Arg3)等同于field2(Arg2,Arg3,field1(Arg1,Term))。

有人可以帮助一个真实世界的例子吗?

1 个答案:

答案 0 :(得分:3)

记录语法是一种语法糖,手册正试图解释如何 从记录语法转换为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,

当事情变得更复杂的时候使用它 状态变量表示法,会出现额外的语法糖。

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

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

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

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

!Point ^ pt_y := NewY.

我希望这会有所帮助。整个水星还有更多的例子 源代码:

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

和其他Mercury项目,请注意github语言标记是 破碎后,许多Objective-C文件被检测为水星和许多水星 事物被检测为其他文件:

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