你从未听说过的一种编程方式
jopen 13年前
<p>本文是从 <a href="/misc/goto?guid=4958327314176108977" target="_blank">A Programming Idiom You've Never Heard Of</a> 这篇文章翻译而来。</p> <hr /> <p>下面是一系列的动作:</p> <blockquote> <p>从小屋里拿出耙子,用它把院子里的树叶堆起来,然后把耙子放回小屋。</p> <p>飞到西雅图,看风景,然后飞回。</p> <p>把钥匙插进钥匙孔,打开,然后取出钥匙。</p> <p>点亮你的手机,查看时间,然后把它置回睡眠状态。</p> </blockquote> <p>看到这些模式没?你做一种事情,然后做另外一种事情,然后又撤销你做的第一件事情。或者用更精确的说法,这最后的一步是第一步的反向操作。一旦你认识到这种模式,你会发现它无处不在。拿起茶杯,喝一口茶,放回茶杯。同样,在程序代码里有到处都是:</p> <blockquote> <p>打开一个文件,读取内容,关闭文件。</p> <p>分配一段内存,用它做一些事情,释放它。</p> <p>把内存地址内容加载到寄存器,修改它,然后存回内存。</p> </blockquote> <p>虽然这很容易解释,也很容易举出例子,但想实现它却不那么容易。我们需要的这种操作看起来应该像这个样子:<tt>idiom(Function1, Function2)</tt>,于是我们上面说的打开文件的例子应该是<tt>idiom(Open, Read)</tt>这个样子。问题是,需要有一种程序的方法能知道这“open”的反向操作是“close”。是否有一种语言,里面的方法可以反向执行?</p> <p>也许会让你惊讶:有。这就是<a href="/misc/goto?guid=4958327314976467319" target="_blank">J</a>语言。我在这里反复唠叨的这种编程模式,实际上是J语言里的一个内置函数,叫做<em>under</em>。在英语里,这打开文件的例子可以说成“read under open”。</p> <p>“under”在J语言里一个非常常见的用处就是计算vector的数量级。算法非常简单:平方每个元素,把值加起来,然后取平方根。哈哈,这第三步正好是第一步的反向。求和 “under” 平方。在J语言里的写法是:</p> <blockquote> <p>mag =: +/&.:*:</p> </blockquote> <p><tt>+/</tt> is “相加”。 这&号,点号,分号序列就是“under”。<tt>*:</tt>就是“平方”。<br /> <br /> 本文转载自: 外刊IT评论 <a href="/misc/goto?guid=4958183272158702965" rel="nofollow" target="_blank">http://www.aqee.net/</a> </p>