1

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

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
4

1 回答 1

3

这个程序的问题是 Chapel 不知道这NumSuch是一个模块的名称,而不是一个记录、类或错字。因此,它不会在您的模块搜索路径中寻找它。解决方法是让 Chapel 知道有一个名为的模块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默认情况下,所有在命令行命名的源文件都会被解析,并且编译器会知道它们的模块。

于 2017-10-04T21:04:11.060 回答