2013-01-19 72 views
2

我不是J中範圍的專家,所以如果我犯了一個錯誤,請糾正我。 (這實際上是對這一問題的部分原因。)如何在J中實現封裝?

我想要做的就是創建一個名稱可見(但不沒有)一個語言環境。請注意,分配=.確實不是達到此目的。

我認爲這是不可能的,但我很樂意得到J專家的確認。

看到Eelvex的回答後,我覺得我必須澄清我的問題。這就是我想要的:我想要一個全局名稱之內的一個語言環境,但不可見外部一個語言環境,即使您知道名稱並使用語言環境後綴對其進行限定,完全類似於OOP中類的私有成員。

讓我們想象一個名爲private的J動詞,它在一個語言環境中使名稱變爲私人。

cocurrent 'foo' 
x =: 3 
private 'x' NB. x is still visible to all members of _foo_, but cannot be accessed in any way outside of _foo_ 
bar =: 3 : 'x & *' 
cocurrent 'base' 

bar_foo_ 14 NB. This works, because bar_foo_ can see x_foo_ 
x_foo_ NB. value error. We can't see x_foo_ because it's private to the locale. 
+2

哦,不,我不認爲你可以隱藏的名稱。如果實體在語言環境中可見,則可以從所有語言環境訪問該實體。 AFAIK唯一真正私有的名稱是用明確的':'定義中的'=。* *'定義的名稱。 – Eelvex

+0

如果這條評論澄清你的答案,我將其標記爲正確的。就目前而言,我無法將您的答案標記爲正確,因爲它不能準確回答問題。 –

回答

2

編輯(後OP的編輯)

不,你不能隱藏的名稱。如果實體在語言環境中可見,則可以從所有語言環境訪問該實體。據我所知,是真正保密的唯一名稱與=.定義的名稱明確:定義中

預覽回答:

所有名稱中可見(但不沒有)他們的語言環境。例如:

a_l1_ =: 15 
    a_l2_ =: 20 
    coclass 'l1' 
    a 
15 
    coclass 'l2' 
    a 
20 
    coclass 'base' 
    a 
|value error: a 
1

簡答:是的,在當前的實現中是不可能的。

長答案:您可能應該將locale看作是類或對象的公共部分(儘管locales也可以用於其他目的,例如堆棧框架或閉包)。

如果您需要隱藏信息,您可能會考慮將其置於不同的進程或不同的計算機上,而不是在語言環境中。您也可以嘗試遮蔽它(例如,使用外部函數接口或文件),但這是否有效取決於您隱藏信息的原因。

即便如此,請注意,訪問任意語言環境中的任意信息有點像在另一種語言中使用調試器API或反射API。你可以這樣做,但如果這不是你想要的,你應該避免這樣做。

這就是說,在我看來,你應該理想地消除私人狀態,而不是隱藏它。 (如果結果太慢,你可能會考慮用其他語言來實現代碼中與速度有關的關鍵部分,J對於探索架構替代品來說非常棒,但目前的實現並不包含適合優化任意代碼的編譯器,高度串行的算法。你可以考慮(13 :)或(f。)是編譯器 - 但他們不會取代類似的GCC編譯工具和他們目前都沒有能夠發射代碼,海灣合作委員會可以處理的)

這就是說,它也假設可能是語言擴展(類似於到9!:24)可以被添加,以防止從新句子顯式訪問語言環境。