从 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 源文件。默认情况下,所有在命令行中命名的源文件都会被解析,并且编译器会知道它们的模块。