2014-02-26 33 views
5

我讀過內部R2存儲環境的兩個表,一個單詞,另一個用於值,因此你可以問他們:以任何方式在Rebol2中,您從THIRD獲得的對象/函數的未公開塊是什麼?

o: context [a: 1 b: 2] 
>> first o 
== [self a b] 
>> second o 
== [make object! [ 
     a: 1 
     b: 2 
    ] 1 2] 

...

>> pick o 1 
== [self a b] 
>> pick o 2 
== [make object! [ 
     a: 1 
     b: 2 
    ] 1 2] 

但有第三個「表」(塊),這似乎是無證和使用第三個功能

>> third o 
== [a: 1 b: 2] 

>> pick o 3 
** Script Error: Out of range or past end 
** Near: pick o 3 

什麼應該是這第三塊這個人是唯一的訪問?

類似的東西似乎在功能發生,但這次雙方第三和挑選表現良好:

>> f: func [a] [print a] 
>> first :f 
== [a] 
>> second :f 
== [print a] 
>> third :f 
== [a] 
>> pick :f 1 
== [a] 
>> pick :f 2 
== [print a] 
>> pick :f 3 
== [a] 

第一塊是參數,可以第二塊是身體,這是什麼第三塊在一個函數代表?

回答

2

您注意到:

>> third o 
== [a: 1 b: 2] 

>> pick o 3 
** Script Error: Out of range or past end 
** Near: pick o 3 

...這是奇怪的。看來在Rebol2中,對於一些邊緣情況,THIRD並不完全與3的PICK同義。 : -/

在Rebol3中不再是這種情況。但是,什麼也沒有任何長的情況是,在Rebol3位置採摘不適用於對象或函數:

>> pick object [a: 1 b: 2] 1 
** Script error: pick does not allow object! for its aggregate argument 

相反,你有話-OF,價值觀,以及身體的:

>> words-of object [a: 1 b: 2] 
== [a b] 

>> values-of object [a: 1 b: 2] 
== [1 2] 

>> body-of object [a: 1 b: 2] 
== [ 
    a: 1 
    b: 2 
] 

這些已被移植到名爲「R2/Forward」的內置庫中的Rebol2,因此您可以(也應該)使用這些函數代替位置選擇。

您注意到正從相似的答案和第三位:

>> f: func [a] [print a] 

>> first :f 
== [a] 

>> second :f 
== [print a] 

>> third :f 
== [a] 

>> pick :f 1 
== [a] 

>> pick :f 2 
== [print a] 

>> pick :f 3 
== [a] 

第一塊參數,可以第二塊是身體,這是什麼第三塊代表的功能?

你的例子太簡單了,以至於第三點的區別在於它是SPEC-OF,因爲你的規範只包含單詞。所以SPEC-OF等於WORDS-OF。爲您的規格添加類型約束可以揭示差異。

>> f: func [a [integer!]] [print a] 

>> first :f 
== [a] 

>> third :f 
== [a [integer!]] 

再次,通過Rebol2 R2 /正向您提供了功能詞對的,SPEC-,以及身體的。再次,避免使用這些屬性的位置選擇。

3

Third返回對象定義。

>> body: [a: 1 b: 2] 
== [a: 1 b: 2] 
>> obj: context body 
>> equal? body third obj 
== true 
>> strict-equal? body third obj 
== true 

這是相同的Rebol 2.7.7 body-of和更高雷博爾3.

相關問題