Rascal 模式变量的类型

Rascal 模式变量的类型,rascal,Rascal,我发现有时我必须为模式变量显式地给出类型,否则Rascal将无法按预期工作。控制台中的以下会话说明了一切: rascal>data foo = bar(int); ok rascal>int x = 1; int: 1 rascal>[x | bar(x) <- [bar(2), bar(3)]]; list[void]: [] rascal>[x | bar(int x) <- [bar(2), bar(3)]]; list[int]: [2,3]

我发现有时我必须为模式变量显式地给出类型,否则Rascal将无法按预期工作。控制台中的以下会话说明了一切:

rascal>data foo = bar(int);
ok

rascal>int x = 1;
int: 1

rascal>[x | bar(x) <- [bar(2), bar(3)]];
list[void]: []

rascal>[x | bar(int x) <- [bar(2), bar(3)]];
list[int]: [2,3]
rascal>data foo=bar(int);
好啊
流氓>整数x=1;
内部:1

rascal>[x|bar(x)[x|bar(int x)在rascal的当前版本中,周围范围中存在的模式中的变量不匹配和阴影,而是检查是否相等

因此:

:==>true//x首先引入,然后检查是否相等
:=>false//x首先被引入,然后检查是否相等
{int x=1;if(x:=2)println(“真”);else println(“假”);//假!
这适用于我们使用模式匹配的所有地方

我们已经收到了一些关于“非线性匹配”这一特殊设计的投诉,我们打算很快添加一个操作符($),以确定从环绕范围内获取某物的意图。如果不使用操作符,则会出现阴影:

 <int x, $x> := <2,2> => true // x is first introduced and then checked for equality
 <int x, $x> := <2,3> => false // x is first introduced and then checked for equality
 <int x, x> := <2,3>  // static error due to illegal shadowing
 <int x, y> := <2,3> => true // x and y are both introduced

 { int x = 1; if ($x := 2) println("true"); else println("false"); // false!
 { int x = 1; if (x := 2) println("true <x>"); else println("false"); // true, prints 2! or perhaps a static error.
:==>true//x首先引入,然后检查是否相等
:=>false//x首先被引入,然后检查是否相等
:=//由于非法阴影而导致静态错误
:=>true//x和y都被引入
{int x=1;if($x:=2)println(“真”);else println(“假”);//假!
{int x=1;if(x:=2)println(“true”);else println(“false”);//true,prints 2!或者可能是一个静态错误。
还可以添加一些额外的功能,使表达式进入模式,如中所示:

 <1, ${1 + 2 + 3}> := <1,6> // true
:=//真

啊,谢谢。希望在源代码中有更多的美元,;):-)你知道为什么我们使用美元作为时间-日期文字吗?呃,不。我很想知道,:)因为时间就是金钱哦,天哪,这是不真实的。:)
 <1, ${1 + 2 + 3}> := <1,6> // true