2013-05-28 42 views

回答

2

不,沒有簡單的方法來解決這個問題。必須更新源代碼,並且每個引用導入的函數都以前述的模塊爲前綴。例如,每次調用format都應該用io_lib:format替換,但您必須知道從哪個模塊導入了哪個函數。

您可以先刪除-import指令。然後編譯失敗,抱怨未定義的函數。那就是你需要提供正確模塊名稱的地方。查看io_lib,erl_scanerl_parse的文檔頁面,瞭解哪些功能在哪個模塊中。

+0

刪除所有從全部導入這些文件似乎沒有其他修改(這是正常的?) – LtWorf

+0

我猜有人清理了代碼,並已經把所有的電話前綴,但忘記取出進口指令。 – legoscia

+0

請注意,那些導入聲明(已刪除的實驗「軟件包」的一部分)未導入特定函數,如常規導入(ModuleName,[Function1,...,FunctionN]),但模塊名稱,以便可以使用「foo」來代替「bar.baz.foo」等。導入一個像io_lib這樣的名稱意味着您不必像使用.io_lib那樣使用前導點來表示「空白」名稱空間。如果包含模塊本身不在包裝中(可能是一次,然後再重新命名),那麼進口沒有任何影響。 – RichardC

-3

首先看看存儲在位置$ERL_LIBS中的內容,通常指向/ usr/lib/erlang/lib。

+0

編譯工作正常,直到dist-upgrade發生,模塊出現在系統上 – LtWorf

+0

據我所知,這就是爲什麼我試圖查看升級過程中模塊是否已被刪除或重命名 – chollida

9

那麼,-import().正在工作,但它確實不是做你期待它做的事情。它不會NOT將模塊「導入」到模塊中,也不會出現,找到模塊並獲取所有導出的函數,並允許您在不使用模塊名稱的情況下使用它們。您可以使用-import這樣的:

-import(lists, [map/2,foldl/3,foldr/3]). 

然後你就可以調用明確導入功能,而模塊名稱和編譯器通過添加模塊名語法轉換呼叫。因此,編譯器將改變:

map(MyFun, List) ===> lists:map(MyFun, List) 

注意,這是ALL它。沒有檢查模塊是否存在,或者是否導出函數,這是一種純粹的樸素語法轉換。它給你的只是稍微短一些的代碼。出於這個原因,很少有人使用大多數人建議不要使用它。

還要注意,所有操作的代碼單元都是模塊,因此編譯器根本不會執行任何模塊間檢查或優化。一切之間的模塊就像檢查模塊的存在或其導出的功能是在運行時完成,當你調用另一個模塊的功能。

+0

是的,我瞭解它的功能。我沒有寫代碼,我只是想讓它工作,如果刪除導入它的工作,顯然名稱轉換沒有使用無論如何,我想 – LtWorf

+0

,無論如何,如果螺紋鋼失敗我會說,導入不工作。 – LtWorf

+0

@LWWorf它取決於你不工作的意思。你給出的例子是**非法語法**,這是編譯器所抱怨的。所以它從來沒有像實際嘗試做一些導入。在這種情況下,Rebar沒有做任何特殊的事情,它使用了普通的erlang解析器和編譯器,所以失敗了,因爲非法語法導致解析器和編譯器失敗。 – rvirding

2

你的問題是你正在使用參數化模塊的一部分的實驗-import(Mod)指令。這些在R16B以後不復存在。

我經常建議不要使用導入。它傷害了外國電話的快速搜索和獨特命名。獲得一個可以快速擴展名稱的編輯器。

+1

謝謝,我避免了參數化模塊:-)所以我錯過了'-import(Mod).'構造。 – rvirding