2013-02-28 40 views
4

一方面,我們有:爲什麼Rebol中的「背景」和「對象」功能不同,但基本相同?

>> source object 
object: make function! [[ 
    "Defines a unique object." 
    blk [block!] "Object words and values." 
][ 
    make object! append blk none 
]] 

對於上下文我們看到:

>> source context 
context: make function! [[ 
    "Defines a unique object." 
    blk [block!] "Object words and values." 
][ 
    make object! blk 
]] 

所以,對於object對象從一個塊構成,其none已被附加。這不會改變長度,或者據我所知,添加任何東西。另一方面,與context一樣,該對象按照原樣用傳入的塊構建。

爲什麼區別和爲什麼,例如,不能context只是object的別名。

回答

3

向後兼容性。我們在Rebol中已經有一個context函數,它以特定方式工作(不初始化變量),但我們需要一個將變量初始化爲none的函數,作爲將對象創建爲數據結構而非代碼容器時的便利函數。

將它稱爲object是有意義的,因爲它是類型名稱,並且由於「上下文」實際上是具有上下文敏感語義的語言中對象的壞名稱(對於單詞「語境「)。這真的會導致一些令人困惑的談話。由於R3現在具有模塊,因此模塊可以更好地覆蓋以前大多數context功能的用途。保持context完全是爲了向後兼容。

目前的object函數幾乎是我們尚未考慮的更好的類型構造包裝的佔位符。我們需要類似的東西,但其行爲可能會有細微的變化,我們會發現更多的用途。首先,它修改其規範塊的事實使得它對遞歸或併發不是很安全。如果這能夠改善它,它可能會最終成爲本地產品,或者如果事實證明這是一種更好的方法,那麼它可能會成爲本地產品。

有一件事情確實是一場勝利,那就是將沒有感嘆號的類型名稱作爲類型構造函數的名稱。我們改變了map也是這樣,我們最終可能會爲其他類型添加類似的構造函數,儘管大多數需要它們的構造函數已經有了。

+1

我仍然好奇在構造函數中需要'append'。爲什麼呢? – Adrian 2013-02-28 21:15:15

+2

APPEND允許您編寫對象[a:b:]並將'a和'b初始化爲NONE。 – Sunanda 2013-02-28 21:57:51

相關問題