从 Chapel 调用外部模块
Calling external module from Chapel
我正在尝试在另一个程序中使用我的 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
因为我不想污染名称 space。我以为我可以
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
这个程序的问题是 Chapel 不知道 NumSuch
是模块的名称而不是记录,class 或拼写错误。因此,它不会在您的模块搜索路径中寻找它。解决方法是让 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(...);
第二种方法是在chpl
命令行中明确列出NumSuch.chpl
源文件。默认情况下,所有在命令行中命名的源文件都会被解析,并且编译器会知道它们的模块。
我正在尝试在另一个程序中使用我的 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
因为我不想污染名称 space。我以为我可以
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
这个程序的问题是 Chapel 不知道 NumSuch
是模块的名称而不是记录,class 或拼写错误。因此,它不会在您的模块搜索路径中寻找它。解决方法是让 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(...);
第二种方法是在chpl
命令行中明确列出NumSuch.chpl
源文件。默认情况下,所有在命令行中命名的源文件都会被解析,并且编译器会知道它们的模块。