我试图将AST中的所有不同类型重写为单一类型(例如char())。到目前为止,我能够找到类型,但我似乎无法找到重写它们的方法。
所以我的想法就是做这样的事情(这个例子并不适合做事):
visit (ast) {
case \Type(_) => \Type(char())
}
有人可以帮助我,并告诉我该怎么做?
答案 0 :(得分:3)
要记住的一件事是你不能使用副作用改变Rascal中的值:当你改变一个值时,你得到的是带有这些改变的那个数据类型的新实例,但是旧实例仍然存在(如果什么都指它)。当您执行visit
时,您将获得数据类型的新实例以及您所做的任何更改,但您需要将其分配给某个地方,否则它将丢失。这是一个说明这个的例子:
rascal>data A = a() | b();
ok
rascal>data A = c(A a);
ok
rascal>myA = c(a());
A: c(a())
rascal>visit(myA) { case a() => b() }
A: c(b())
rascal>myA;
A: c(a())
rascal>myA = visit(myA) { case a() => b() }
A: c(b())
rascal>myA;
A: c(b())
正如您所看到的,第一个visit
a()
内的c(a())
更改为b()
,但myA
仍然是之前的状态。将visit
的值分配到myA
后,将保留更改。