IT技术博客大学习 共学习 共进步

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

外刊IT评论 2012-02-01 17:29:44 浏览 4,303 次
本文是从 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”。*:就是“平方”。

建议继续学习

  1. 我是如何学习计算机编程的 (阅读 181,021)
  2. 面向“接口”编程和面向“实现”编程 (阅读 13,761)
  3. 我学编程时犯的最大两个错误 (阅读 7,862)
  4. 提高编程技能最有效的方法 (阅读 6,402)
  5. 函数式编程很难,这正是你要学习它的原因 (阅读 5,302)
  6. 如果你看不见你还能编程吗? (阅读 4,903)
  7. 那些曾伴我走过编程之路的软件 (阅读 4,763)
  8. 函数式编程 (阅读 4,585)
  9. 也谈编程改革 (阅读 4,241)
  10. 编程的首要原则(s)是什么? (阅读 3,505)