Re: [轉錄][問題] first-class object

看板PLT (程式語言與理論)作者 (godfat 真常)時間17年前 (2007/07/28 20:45), 編輯推噓2(202)
留言4則, 3人參與, 最新討論串2/2 (看更多)
不是作者轉的有一點失望 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

07/28 21:34, , 1F
嗯---- boost就是一個詭異的例子吧(笑
07/28 21:34, 1F

07/28 21:44, , 2F
感謝兩位,我還不會轉文-.-",謝謝godfat^^
07/28 21:44, 2F

07/28 21:47, , 3F
太深奧了,還是頭次發現PLT版○rz
07/28 21:47, 3F

07/30 01:21, , 4F
好文!
07/30 01:21, 4F
文章代碼(AID): #16gpfqh- (PLT)
討論串 (同標題文章)
文章代碼(AID): #16gpfqh- (PLT)