2014-01-23 44 views
0

我發現Erlang的模塊元數據導入/n其中n是參數的數量而非常奇怪。Erlang爲什麼在進口商品中有商品?

在Java和其他各種語言,你可以這樣做:

import static com.stuff.Blah.myFunction; 

這將導入所有重載Blay.myFunction(..)無論參數。

除了我想明白爲什麼語言設計師認爲這是一個好主意(我不是試圖批評語言......只是好奇)?

  • 它與代碼交換有關嗎?
  • 或者它是否與隱藏後衛遞歸方法?如果是這樣的話,爲什麼不允許在出口方面進行協商,但是不需要進口協議?
  • 爲什麼我想要那麼明確?那是導入兩個參數函數,但不是myFunction的三個參數?

回答

9

你應該知道在Erlang中導入函數的真正用處。這是一個純文本轉換。如果我執行-import(foo, [bar/1,baz/2]).,這意味着當我編寫諸如bar(5)baz(a, 3)的調用時,編譯器會將它們轉換爲foo:bar(5)foo:baz(a, 3)。就是這樣,沒有別的。它不檢查任何東西:

  • 它不檢查模塊foo所包含的功能bar/1baz/2
  • 它甚至不檢查模塊foo是否存在。

真的,它所做的只是隱藏你在另一個模塊中調用一個函數。這就是爲什麼經驗豐富的Erlanger的建議是「不要使用它」。那是一個錯誤。不幸的是,添加愚蠢的東西要比擺脫它們容易得多,所以我們永遠無法刪除它。

「這與代碼交換有關嗎?」

是的,有點。 的單元全部爲 Erlang中的代碼處理是模塊。所以你編譯模塊,加載模塊,清除和刪除模塊。這意味着系統中根本不存在模塊間依賴關係,並且編譯器在編譯模塊時不會假定其他模塊。沒有假設模塊編譯的環境將與其運行的環境相同。這就是爲什麼它在運行時會檢查你正試圖調用另一個的函數是否存在,或者即使模塊本身存在。這就是爲什麼import是純粹的文本轉換。

+0

絕對。不要使用導入,它會使代碼更難閱讀。去過也做過。 – Berzemus

1

它與代碼交換有關嗎?

的種類。與Java類不同,Erlang中的模塊單獨編譯(這是允許代碼交換的一部分),因此編譯器不知道存在多少個具有不同arity的導入函數版本。當然,它可以假設所有具有給定名稱的函數調用都來自同一個模塊,但設計人員可能認爲它不是特別有用。

實際上,至少在我的經驗中,您幾乎不想使用導入,就像很少使用Java中的靜態導入一樣。只需編寫module:function,如Class.staticMethod

或者它是否需要隱藏守護方法遞歸?

不,因爲沒有導入功能不會以任何方式隱藏它們。

2

Erlang最初是在Prolog開發的。

在Prolog中,arity爲您認爲是'參數的額外含義,正如我從過程式編程語言中的函數'理解的。但是這種模式在這裏不適用。

所謂的從句「已婚(X,Y)」。和「已婚(X,Y,Z)」。意味着一種不同的「已婚」關係,可以宣稱已婚2,已婚3。

在過程式編程中,'add(a,b)'或'add(a,b,c)'用於生成不同數量參數的添加。在Prolog中並非如此,在這種情況下,可能存在「a和b,添加」或「a,b和c」這兩個關係的含義。不用說,Prolog允許你聲明'add',就像你期望函數會做的那樣。但它允許更多。更多可用的含義,意味着更多需要控制它。

就像在任何模塊系統中一樣,選擇你想暴露給外部客戶端的東西也是有道理的:因此聲明瞭arity。

相關問題