2017-10-04 68 views
1

我正在尝试在另一个程序中使用我的NumSuch模块。我Makefile包括从Chapel调用外部模块

NUMSUCH_HOME=/home/buddha314/numsuch/src 
MODULES=-M$(NUMSUCH_HOME) 

yummly: yummlyAnalysis.chpl 
    $(CC) $(FLAGS) $(MODULES) -o yummlyAnalysis $< 
    #$(CC) $(MODULES) -o yummlyAnalysis $< 

中的代码,我不想因为use NumSuch我不想污染名字空间。我以为我可以

var g = NumSuch.buildFromSparseMatrix(A, weighted=false, directed=false); 

但是在编译过程中,我得到

yummlyAnalysis.chpl:72: error: 'NumSuch' undeclared (first use this function) 
Makefile:12: recipe for target 'yummly' failed 

回答

3

这个程序的问题是,教堂不知道NumSuch是模块的名称,而不是一个记录,班级或打字错误。因此,它不会在模块搜索路径中查找它。解决方法是让教堂知道,有一个名为NumSuch模块:

的一种方式做,这是通过一个use声明(此断言存在与给定名称的模块,并会导致编译器去寻找因为如果它还没有找到它)。你能避免命名空间污染,你会使用导致要在use语句的范围内可见无符号滤镜希望:

use NumSuch only ;  // only make this (empty) list of symbols available 

或:

use NumSuch except *; // make all symbols available except for `*` (all of them) 

无论这些语句后,您的电话应该工作:

NumSuch.buildFromSparseMatrix(...); 

和不合格的通话不应该因为是通过use提供无符号:

buildFromSparseMatrix(...); 

你甚至可以把use语句转换成一些其他的范围,这将导致编译器去寻找模块,找到它,知道有该名称的模块,并命名空间的污染限制在该范围(虽然我比以前更地道考虑这个风格上糟糕的是,接近):

{ 
    use NumSuch; // causes the compiler to go looking for module NumSuch; limits namespace pollution to this scope... 
} 
NumSuch.buildFromSparseMatrix(...); 

做到这一点的第二种方法是列出NumSuch.chpl源文件中明确对chpl命令行。默认情况下,命令行上命名的所有源文件都会被解析,并且它们的模块会被编译器知道。