作者godfat (godfat 真常)
看板PLT
標題Re: [轉錄][問題] first-class object
時間Sat Jul 28 20:45:35 2007
不是作者轉的有一點失望 XD
: ※ [本文轉錄自 C_and_CPP 看板]
: 作者: sai199 (Adapter) 看板: C_and_CPP
: 標題: [問題] first-class object
: 時間: Sat Jul 28 19:25:48 2007
: 『這對於像C++這種不將類別視為一級物件 (first-class object) 的程式語言來說,』
就像推文所說的,first-class object 指的就是你可以把他當成可以任意操作的 value
wikipedia 上其實寫得很清楚了,這裡就大略用中文講一次,並給點實例
Depending on the language, this can imply:
* being expressible as an anonymous literal value
可以當作一個匿名的字面數值,例如數字:1 2 3
你不需要特別給他一個名字,就可以使用數字
* being storable in variables
可以存到變數裡面。在 C++ 中,class 不是 first-class, 所以你不能:
class T{};
T' t = T;
你找不到一個可以儲存 class 的 variable/type
* being storable in data structures
這意思跟上面的差不多﹍
* having an intrinsic identity (independent of any given name)
這個看不太懂,我想是指可以給他任意名字,如果是這樣那跟存到變數裡的意思差不多
* being comparable for equality with other entities
可以拿來被比較,例如:
class T{}; class U{};
cout << T == U;
當然這在 C++ 中不合法,你只能透過間接的手段:
cout << typeinfo(T) == typeinfo(U);
* being passable as a parameter to a procedure/function
可以當作參數去傳遞(可以存到變數裡就可以當作參數傳,說來說去意思都差不多﹍)
* being returnable as the result of a procedure/function
可以被回傳
* being constructable at runtime
可以在執行期間被產生出來,這點也是非常明確,你不能在 C++ 執行期產生 class
所有的 class 都必須在 compile time 就決定好,日後也不得改變。
* being printable
可以被印出來,C++ 中可透過間接的方法
cout << typeinfo(T).name();
然而這個 name 是實做決定(implementation defined),
所以在不同 compiler 下出來的結果並不會一樣。
例如 ms 的 vc 系列都是印很白話的:class T
而 g++ 則會產生不容易讓人看懂的:1T 之類的,用一個數字表示後面名字的長度,
緊接著就是那個真正的名稱。碰到 template 時幾乎是完全無法閱讀。
我猜這是為了要讓名稱統一之故。
* being readable
這不知道指什麼
* being transmissible among distributed processes
可以在不同的 processes 間傳遞,這也跟變數的意思差不多
* being storable outside running processes
這大概是指可以被 dump 出來的意思。
所以簡單地說就是 first-class 就是指可以自由使用的意思。
不是 first-class 的話,什麼可能都有,像是 C++ 的 class 限制就很多,
template 則限制又更多了,因為他已經是 metaprogramming 的層次了。
不過一般會談到 first-class 的不是 class, 而是 function,
這在 functional programming 中非常重要,雖然一般是用 higher-order 這個詞,
把焦點放在另外一個層次上了 :p
在 C++ 中要做 first-class function, 可以靠 boost 的 lambda library,
用了一堆非常 tricky 的方式達到 first-class function, 有點彆扭,
不過還算可以用,有興趣的話可以去看看。
我覺得 C++ 可怕之處就在於雖然語言上欠缺不少東西,卻總是能看到有人用
很詭異的方式實做出來,儘管有點殘廢,但至少有點樣子了。
--
『風車』が廻り続ける度に 『美しき』幻想が静かに紡がれ
『焔』の揺らめきの外に 『腕』を伸ばす愚かな者達 -《Roman》5th Story
『宝石』をより多く掴もうと 『朝と夜』の狭間を彷徨い続ける Track 10
『星屑』の砂の煌めきにも 『葡萄酒』の仄甘い陶酔を魅せ 黄昏の賢者
『賢者』が忌避する檻の中から 『伝言』の真意を彼等に問うだろう
『天使』が别れを告げし時 『地平線』は第五の物語を識る
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 220.135.28.18
1F:→ sunneo:嗯---- boost就是一個詭異的例子吧(笑 07/28 21:34
2F:推 sai199:感謝兩位,我還不會轉文-.-",謝謝godfat^^ 07/28 21:44
3F:→ sai199:太深奧了,還是頭次發現PLT版○rz 07/28 21:47
4F:推 timTan:好文! 07/30 01:21