在 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 来缓存先前的结果)。