2017-10-04 55 views
1

我正在嘗試在另一個程序中使用我的NumSuch模塊。我Makefile包括從Chapel調用外部模塊

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 

回答

3

這個程序的問題是,教堂不知道NumSuch是模塊的名稱,而不是一個記錄,班級或打字錯誤。因此,它不會在模塊搜索路徑中查找它。解決方法是讓教堂知道,有一個名爲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命令行。默認情況下,命令行上命名的所有源文件都會被解析,並且它們的模塊會被編譯器知道。