Вызов внешнего модуля из часовни

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

Другие вопросы по тегам