你從未聽(tīng)說(shuō)過(guò)的一種編程方式
本文是從A Programming Idiom You've Never Heard Of 這篇文章翻譯而來(lái)。
下面是一系列的動(dòng)作:
從小屋里拿出耙子,用它把院子里的樹(shù)葉堆起來(lái),然后把耙子放回小屋。 飛到西雅圖,看風(fēng)景,然后飛回。 把鑰匙插進(jìn)鑰匙孔,打開(kāi),然后取出鑰匙。 點(diǎn)亮你的手機(jī),查看時(shí)間,然后把它置回睡眠狀態(tài)。 |
看到這些模式?jīng)]?你做一種事情,然后做另外一種事情,然后又撤銷你做的第一件事情?;蛘哂酶_的說(shuō)法,這最后的一步是第一步的反向操作。一旦你認(rèn)識(shí)到這種模式,你會(huì)發(fā)現(xiàn)它無(wú)處不在。拿起茶杯,喝一口茶,放回茶杯。同樣,在程序代碼里有到處都是:
打開(kāi)一個(gè)文件,讀取內(nèi)容,關(guān)閉文件。 分配一段內(nèi)存,用它做一些事情,釋放它。 把內(nèi)存地址內(nèi)容加載到寄存器,修改它,然后存回內(nèi)存。 |
雖然這很容易解釋,也很容易舉出例子,但想實(shí)現(xiàn)它卻不那么容易。我們需要的這種操作看起來(lái)應(yīng)該像這個(gè)樣子:idiom(Function1, Function2),于是我們上面說(shuō)的打開(kāi)文件的例子應(yīng)該是idiom(Open, Read)這個(gè)樣子。問(wèn)題是,需要有一種程序的方法能知道這“open”的反向操作是“close”。是否有一種語(yǔ)言,里面的方法可以反向執(zhí)行?
也許會(huì)讓你驚訝:有。這就是J語(yǔ)言。我在這里反復(fù)嘮叨的這種編程模式,實(shí)際上是J語(yǔ)言里的一個(gè)內(nèi)置函數(shù),叫做under。在英語(yǔ)里,這打開(kāi)文件的例子可以說(shuō)成“read under open”。
“under”在J語(yǔ)言里一個(gè)非常常見(jiàn)的用處就是計(jì)算vector的數(shù)量級(jí)。算法非常簡(jiǎn)單:平方每個(gè)元素,把值加起來(lái),然后取平方根。哈哈,這第三步正好是第一步的反向。求和 “under” 平方。在J語(yǔ)言里的寫(xiě)法是:
- mag =: +/&.:*:
+/ is “相加”。 這&號(hào),點(diǎn)號(hào),分號(hào)序列就是“under”。*:就是“平方”。
原文鏈接:http://www.aqee.net/a-programming-idiom-you-ve-never-heard-of/
【編輯推薦】