歡迎您光臨本站 註冊首頁

你從未聽說過的一種編程方式

←手機掃碼閱讀     火星人 @ 2014-03-12 , reply:0
  

本文是從 A Programming Idiom You've Never Heard Of 這篇文章翻譯而來。

 


下面是一系列的動作:

 

從小屋裡拿出耙子,用它把院子里的樹葉堆起來,然後把耙子放回小屋。

飛到西雅圖,看風景,然後飛回。

把鑰匙插進鑰匙孔,打開,然後取出鑰匙。

點亮你的手機,查看時間,然後把它置回睡眠狀態。

 

看到這些模式沒?你做一種事情,然後做另外一種事情,然後又撤銷你做的第一件事情。或者用更精確的說法,這最後的一步是第一步的反向操作。一旦你認識到這種模式,你會發現它無處不在。拿起茶杯,喝一口茶,放回茶杯。同樣,在程序代碼里有到處都是:

 

打開一個文件,讀取內容,關閉文件。

分配一段內存,用它做一些事情,釋放它。

把內存地址內容載入到寄存器,修改它,然後存回內存。

 

雖然這很容易解釋,也很容易舉出例子,但想實現它卻不那麼容易。我們需要的這種操作看起來應該像這個樣子:idiom(Function1, Function2),於是我們上面說的打開文件的例子應該是idiom(Open, Read)這個樣子。問題是,需要有一種程序的方法能知道這“open”的反向操作是“close”。是否有一種語言,裡面的方法可以反向執行?

 

也許會讓你驚訝:有。這就是J語言。我在這裡反覆嘮叨的這種編程模式,實際上是J語言里的一個內置函數,叫做under。在英語里,這打開文件的例子可以說成“read under open”。

 

“under”在J語言里一個非常常見的用處就是計算vector的數量級。演算法非常簡單:平方每個元素,把值加起來,然後取平方根。哈哈,這第三步正好是第一步的反向。求和 “under” 平方。在J語言里的寫法是:

 

mag =: +/&.:*:

+/ is “相加”。 這&號,點號,分號序列就是“under”。*:就是“平方”。

 

 



[火星人 ] 你從未聽說過的一種編程方式已經有349次圍觀

http://coctec.com/docs/program/show-post-71391.html