在 Rascal 中代表 class table
Representing a class table in Rascal
我想在 Rascal 中将一种 class table (CT) 表示为单例,以便某些转换可能引用相同的 CT。由于并非所有转换都需要引用 CT(而且我不希望更改现有转换的签名),我想知道是否可以在其中实现一种 单例对象 无赖。
对于这种情况,有什么推荐的吗?
已编辑:找到了解决方案,但仍不确定这是否是惯用的 Rascal 方法。
module lang::java::analysis::ClassTable
import Map;
import lang::java::m3::M3Util;
// the class table considered in the source
// code analysis and transformations.
map[str, str] classTable = ();
/**
* Load a class table from a list of JAR files.
* It uses a simple cache mechanism to avoid loading the
* class table each time it is necessary.
*/
map[str, str] loadClassTable(list[loc] jars) {
if(size(classTable) == 0) {
classTable = classesHierarchy(jars);
}
return classTable;
}
问题的两个答案:"what to do if you want to share data acros functions and modules, but not pass the data around as an additional parameter, or as an additional return value?":
- a public 全局变量可以保存对共享数据对象的引用,如下所示:
public int myGlobalInt = 666;
这适用于所有类型的(复杂)数据,包括 class table秒。仅当您需要 public 变量的共享 state 时才使用它。
- a
@memo
函数是一种提供快速访问共享数据的方法,以防您需要共享不会被修改的数据(即您不需要共享状态):@memo int mySharedDataProvider(MyType myArgs) = hardToGetData();
。该函数的行为不能有副作用,即 "functional",然后它永远不会为先前提供的参数重新计算 return 值(相反,它将使用内部 table 来缓存先前的结果)。
我想在 Rascal 中将一种 class table (CT) 表示为单例,以便某些转换可能引用相同的 CT。由于并非所有转换都需要引用 CT(而且我不希望更改现有转换的签名),我想知道是否可以在其中实现一种 单例对象 无赖。
对于这种情况,有什么推荐的吗?
已编辑:找到了解决方案,但仍不确定这是否是惯用的 Rascal 方法。
module lang::java::analysis::ClassTable
import Map;
import lang::java::m3::M3Util;
// the class table considered in the source
// code analysis and transformations.
map[str, str] classTable = ();
/**
* Load a class table from a list of JAR files.
* It uses a simple cache mechanism to avoid loading the
* class table each time it is necessary.
*/
map[str, str] loadClassTable(list[loc] jars) {
if(size(classTable) == 0) {
classTable = classesHierarchy(jars);
}
return classTable;
}
问题的两个答案:"what to do if you want to share data acros functions and modules, but not pass the data around as an additional parameter, or as an additional return value?":
- a public 全局变量可以保存对共享数据对象的引用,如下所示:
public int myGlobalInt = 666;
这适用于所有类型的(复杂)数据,包括 class table秒。仅当您需要 public 变量的共享 state 时才使用它。 - a
@memo
函数是一种提供快速访问共享数据的方法,以防您需要共享不会被修改的数据(即您不需要共享状态):@memo int mySharedDataProvider(MyType myArgs) = hardToGetData();
。该函数的行为不能有副作用,即 "functional",然后它永远不会为先前提供的参数重新计算 return 值(相反,它将使用内部 table 来缓存先前的结果)。