你从未听说过的一种编程方式

红薯
 红薯
发布于 2012年02月01日
收藏 12

本文是从 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”。*:就是“平方”。

本站文章除注明转载外,均为本站原创或编译。欢迎任何形式的转载,但请务必注明出处,尊重他人劳动共创开源社区。
转载请注明:文章转载自 OSCHINA 社区 [http://www.oschina.net]
本文标题:你从未听说过的一种编程方式
加载中

最新评论(14

林威
林威
感觉有点像 SQL 的思想,不知大家有没有感觉到,SQL 就是把 open 和 close 都自己处理了,只要 read 就可以了
SudyX
SudyX
J# ? J++ ?
BaiYang
BaiYang
否则要析构函数干吗?
寻找爱玩Tom
寻找爱玩Tom
其实看,这种思想还是很少人能真正发现,顶个
summer_charlie
summer_charlie
打开一个文件,读取内容,关闭文件。
分配一段内存,用它做一些事情,释放它。
把内存地址内容加载到寄存器,修改它,然后存回内存。

应该是:

打开一个文件,读取内容,操作完毕, 关闭文件。
分配一段内存,用它做一些事情,操作完毕, 释放它。
把内存地址内容加载到寄存器,修改它,操作完毕, 然后存回内存。

如何判断 "操作完毕" 呢??
zuiw
zuiw
有始有终,
Yisen
Yisen
设置一系列反向操作的对应序列
然后写个包裹函数,调用了某个操作后再查询其反向操作再自动执行
eagle.gd
eagle.gd
作者也真是的 每次都说更新了 但是 又没说 具体有哪些改进 这点才是我们关注的 一味地说版本不断升级 有什么用啊
返回顶部
顶部