Вызов внешнего модуля из часовни
Я пытаюсь использовать мой модуль 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
1 ответ
Проблема с этой программой в том, что часовня не знает, что 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
командная строка. По умолчанию все исходные файлы, указанные в командной строке, анализируются, а их модули становятся известными компилятору.