2014-01-11 16 views
3

中功能發現如果一個字段是一個對象:如何用塊代替對象使用IN?在Rebol的

USAGE: 
    IN object word 

DESCRIPTION: 
    Returns the word or block in the object's context. 
    IN is a native value. 

ARGUMENTS: 
    object (any-object! block!) 
    word -- (modified if series) (any-word! block! paren!) 

的權利要求是它與對象或塊。它的工作原理沒關係,如果我嘗試它與對象:

>> in object [foo: 10 bar: 20] 'foo 
== foo 

但是,如果我只是一個原始塊嘗試,它給回NONE:

>> in [foo: 10 bar: 20] 'foo 
== none 

想我會明白,如果它沒」 t支持塊(Rebol2沒有)。但是不會返回NONE允許哪些塊允許的情況?

並且冒着將這兩個問題置於其中的風險,接受BLOCK的處理方式是什麼!爲word參數?我倒是覺得,如果你有一組你要找的話,將採取一個塊,但它似乎只返回塊:

>> in object [foo: 10 bar: 20] [mumble frotz bar] 
== [mumble frotz bar] 

>> in object [foo: 10 bar: 20] [mumble frotz] 
== [mumble frotz] 

而在使這個三個問題的進一步的風險,還有什麼意義會採取PAREN!換字有?

+0

的輕微缺點是在籃板這一新行爲OL3?我似乎無法使用rebol2或紅色塊: '**腳本錯誤:在預期的對象參數類型:對象端口 **近:in [foo:10 bar:20]'foo' –

+0

@ GeekyI它似乎不在Rebol2中。但Red 0.6.1似乎接受塊作爲參數......雖然它看起來是錯誤的結果。 'obj:使物體! [a:10 b:20 c:30]',然後在obj [a c]中返回對象而不是回彈塊。您可能會在跟蹤器上提出問題以澄清意圖。 – HostileFork

+0

我剛剛意識到這是1中的3個問題,因此混淆:-p,我的意思是第一個問題(所以......我不能提供任何人......?) –

回答

5

中功能主要不是意味着用於搜索一個對象爲一個字,它是,或在結合於對象Rebol的術語返回是對象字的字或塊。它是BIND函數的一個變體,在BIND以外的不同環境中很有用。

如果在對象中沒有該名稱的單詞,它將不會返回任何合理的內容。這給了它能夠在條件表達式中用作字檢測函數的副作用,但這不是它的主要用途。

IN可以爲其對象參數獲取一個對象塊,然後嘗試依次將該單詞綁定到每個對象,並返回綁定到該單詞塊中第一個對象的單詞。這是一種相對較快的方式,可以爲舊的Rebol 3 GUI設計重寫單詞查找,但事實證明這並不是最好的方法,因此GUI現在不使用該設計。然而,IN 塊字被保留作爲將來在別處使用的潛在有用特徵。

在您的示例中,該塊中沒有對象,因此IN沒有任何可以將該單詞綁定到的對象。這就是IN沒有返回的原因。

如果您傳入IN參數的單詞塊,它會在塊返回之前將該塊綁定到該對象。這是爲了允許代碼如do in obj [print a]。雖然它不會執行bind/copy,所以您應該小心這樣的代碼。或者,也許IN 對象塊應該複製 - 是否爲時已晚?爲單詞參數傳遞paren應該具有與傳遞塊相同的綁定行爲。

最後一次檢查時,我們不支持將對象的單詞參數設置爲塊。這是因爲我們無法弄清楚這種行爲應該是什麼樣的好模式,至少很明顯。壓倒性的單詞查找並不真正與單詞塊結合使用,因爲結果將不確定。

有一個函數可以將塊依次重新映射到一系列對象,特別是重新創建Rebol的非真正嵌套的作用域,但這對於將該函數設置爲IN而言會非常令人困惑。

+0

所以長話短說:* FIND是多態的並返回邏輯! 「是對象的關鍵」,而IN與BIND voodoo有關...而不是你可能認爲它是因爲名字而產生的。*我覺得我擔心的是,在FIND對於塊和對象來說如此不同,如果「有鑰匙」是防止事故的單獨事件,那將更安全。也許HAS可以用於返回布爾結果的東西(對於那些使用函數的東西來說不是一個很好的詞,IMO)...並且FIND總是返回系列位置?即使有多態性能力,也應該有不變量。 – HostileFork

+0

我不打算進行一場本應該發生的火焰戰爭,所以我們只關注一下是什麼。 FIND是多態的,因爲它是一個動作,並且只有動作的動作或包裝在Rebol中才是多態的。不在內部調用動作的本機不是多態的。 IN是一個介詞,所以這個函數的目的是爲了在英語中使用它,比如'get obj'a''或'set obj'a 200''或'do obj [something]'。它存在的主要原因是代碼清晰,否則我們可以使用BIND。單獨使用IN沒有意義。 – BrianH

2

這可能不是有用的,但因爲它沒有明確提及,我認爲是「正確」的方式來解決你的第一個問題,現在:

red>> first find [foo: 10 bar: 20] 'foo 
== foo: 

這不會對rebol2工作壽,但quote荷蘭國際集團的set-word!做:

>> first find [foo: 10 bar: 20] quote [foo:] 
== foo: 

仍然返回set-word!

+1

是的,FIND是正確的操作來檢查什麼時候在塊中。問題(及其答案)最終與IN的問題有關。在提出這個問題後的多年後,我瞭解它的目的是反轉BIND的參數順序....不是FIND的一種形式。 – HostileFork

+0

@HostileFork問題的關鍵在於'in'可能是'has-key'的一個新手錯誤。其實,作爲一個更通用的*包含*就像python –

+1

的'in'關鍵字是的,我理解這個混淆(就像我也有)。但事實證明,這種IN的定義具有廣泛的應用。而不是'foo/method1 a b | foo/method2 c d | foo/method3 e f'你可以說'做在foo [method1 a b | method2 c d | method3 e f]'(好吧,假設foo中沒有a,b,c,d,e,f!)。也許如果錯誤信息是更多的信息來指導人們尋找,如果他們試圖用塊看看,它可能是兩全其美? – HostileFork