- 论坛徽章:
- 2
|
本帖最后由 OwnWaterloo 于 2012-11-19 00:09 编辑
starwing83 发表于 2012-11-18 21:34 ![]()
你还是没科普你所说的“异常”。
这个先放一边,反正你得在这个帖子里面说明白了,啥时候写都行。
我就是还没来得及写啊。。。 你这到底是要我这就写还是等会写。。。 就现在写吧。。。
C++,Java(Clojure),C#,Python,Elisp,CL,Scheme,它们 —— 或者只说Python之前的那些,因为后面那些的non local jump各有各的不同,也不自称为异常 —— 的异常是可以一路走到底的。
发现错误的点抛异常。 想处理错误的点写try/catch。 不想处理错误的点写try/finally或者析构或者with。 不需要进行exception <-> status code的转换。
C++得单独算, 如果不考虑编译器兼容, 也是可以一路走到底。
C++如果考虑编译器兼容, 就要在编译边界进行 exception <-> status code 的转换。 边界之中, 异常也是可以走到底。
而lua。。。 转换粒度比C++还小是闹哪样。。。
这方面Lua只能和C归到一类, 只有non local jump,没有配套的non local jump发生或不发生时执行相应动作的机制。
错误报告用longjmp。 无论想不想处理错误, 都得写setjmp <- 推论就是这相比status code没有优势,反而劣势一大堆,于是就不会被普遍采用。
不同点是Lua有first class function(closure)而C没有。 于是就可以将一些重复的代码块写为函数protect/newtry, 然后复用,而不是次次都setjmp/pcall, longjmp/error。
但lua不是lazy的,也就是说传递给这些函数的不能是代码, 而必须将代码包裹在一个function里, 延缓它的求值。而且, lua的function literal又那么长。。。
总之,用error的优势在哪里?
到底有多少人会去主动用error的? 不是因为底层的库用了non local jump所以他们也被迫用? 而是他们自己觉得应该用error? 这样的库被lua社区接受的又有多少?
多少人是因为lua的一些内建函数用error,所以他们不得不pcall? 如果lua内建函数都改为status code,他们会就开心得不得了?
如果只讨论潜力,现在听得到的语言没几个不是图灵完备的,潜力都一样。
哪又是什么导致这些语言有一样的潜力, 但就是各有不同? 因为在不同语言里做不同相同的事代价不同。
如果某种编程方式代价过高 —— 比如java8之前连function literal都没有 —— 怎么玩高阶函数相关的东西? C++没有lambda之前, algorithm也基本是个废物。
而那种模棱两可的, 说高不高说低不低的, 就不会被广泛应用。 比如lua的异常处理, scheme的先构建编译器再编程。 你能给我数据说明这两者的比例真的不是一些geek在玩, 而是真的有不少的人在这么用?
我在C++里尽量避免用异常也是这个原因, exception <- > status code转换太烦了。 这里多出的代码用exception不一定省得下来, 那为什么还要用? |
|