比對(duì)象更抽象的是函數(shù) 比函數(shù)更抽象的是list
在數(shù)據(jù)結(jié)構(gòu)課程中我們學(xué)習(xí)了 list等價(jià)于樹 或者 廣義表 而圖可以轉(zhuǎn)化為樹處理 所以list可以表示任何數(shù)據(jù)機(jī)構(gòu) 簡(jiǎn)單的說(shuō)就是一切皆為list
因此有一門語(yǔ)言叫Lisp, clojure是其在jvm上的方言版本.
我們無(wú)法把clojure簡(jiǎn)單歸為面向?qū)ο蠡蚝瘮?shù)式語(yǔ)言.在clojure中,
map是匿名對(duì)象 lambda是匿名函數(shù)
而我們?cè)诿嫦驅(qū)ο缶幊讨兴f(shuō)的類其實(shí)是函數(shù), 如果看javascript 這一點(diǎn)很明顯, es6增加了class, 但仍然只是函數(shù)的語(yǔ)法糖. 而對(duì)象是有名稱的map?
鑒于傳統(tǒng)面向?qū)ο竽J綄?dǎo)致的過(guò)度復(fù)雜性 現(xiàn)代語(yǔ)言都在反思簡(jiǎn)化這一設(shè)計(jì) 如go就是使用了改良的struct 避免了復(fù)雜的類層級(jí)系統(tǒng)
用lisp的寫法
(類名/函數(shù)名 域/局部變量)
對(duì)象最好只包含值 方法都在接口中 js是在原型中
而數(shù)據(jù)總可以表示為遞歸的list
(head tail)
從計(jì)算機(jī)的基礎(chǔ)結(jié)構(gòu)來(lái)看,任何計(jì)算都可以表示為list
(cpu memory)
匯編(機(jī)器)語(yǔ)言版本是
(指令 操作數(shù))
(地址 值)
(根節(jié)點(diǎn) 子節(jié)點(diǎn)/森林)
(monad 函數(shù)list)
(進(jìn)程 內(nèi)存地址空間)
(硬件 軟件)
(函數(shù) 數(shù)據(jù))
而這背后的思想可以追溯到歷史更為久遠(yuǎn)的lambda演算
(lambda 參數(shù))?
也可以叫做調(diào)用 或 規(guī)約
每個(gè)list都是lambda 可以規(guī)約到最簡(jiǎn)形式
規(guī)約 調(diào)用 之后 產(chǎn)生新的list
就像一個(gè)小計(jì)算機(jī)
數(shù)據(jù)放入內(nèi)存 cpu處理后產(chǎn)生新的計(jì)算機(jī)?
盡管從技術(shù)實(shí)現(xiàn)的角度看 很多操作是在原地更新 但是時(shí)間改變了 舊的狀態(tài)成為了回不去的歷史 實(shí)際是產(chǎn)生了新的狀態(tài)
所謂大道至簡(jiǎn) 世界的本質(zhì)就是 同一 與 和諧