【IT168 技术文档】今天听徐x在BJUG上大谈Scheme,私下又讨论了一下。觉得有两点结论颇为有意思,是关于fp和ip之间的。
1、使用fp写算法的时候经常希望用set!。但是使用了set!就有side-effect了。为了保持fp的相关优点不受到破坏,徐x同学使用了以下两种方式:
a、使用另外一种非直觉,但是fp的方式来写算法。当然算法的易懂性和执行效率就受到了损害。
b、使用stream,进行lazy求值,但是只适合分阶段计算,两个阶段中间没有明确的关系,把第一阶段的值“放”到stream中。其实这个和传一个high-order function进去是一样的。
2、徐x同志说用java的时候能有c的DEFINE就好了。其实c的宏是很弱的。ip中做meta programming比较强的有MASM和C++的模板。前者的编译期计算的能力达到了图灵完备的程度,后者也基本上无所不能了,虽然做得很 tricky。但是两者的meta programming都遇到了很多问题。基本上都是因为调试测试的问题而被广大人民群众所唾弃。我就觉得很奇怪了,为什么lisp就没有这个问题。后来我想明白了,其实对于lisp来说,宏展开和计算是一回事。但是对于ip来说,宏展开是一个和程序机器语义执行完全不同的过程。当一段程序我们要对他进行机器语义的解毒已经颇为不易了(因为不光有算法,还有时序),现在还要加一个符号计算的宏展开,基本上只有天才才能读的东西了。
所以,最终我的一个结论是,两者都有很大缺陷。fp不是越pure越好用,ip也应该用合适的方式借鉴一些fp的东西,但是不要照搬一套meta系统过来。
| 第1页: 函数式编程和命令式编程之间 |