430页之后漫画部分的翻译_Land of Lisp书评-查字典图书网
查字典图书网
当前位置: 查字典 > 图书网 > 编程 > Land of Lisp > 430页之后漫画部分的翻译
邻家のR君 Land of Lisp 的书评 发表时间:2011-06-28 15:06:26

430页之后漫画部分的翻译

430页之后是漫画了,它解释了Lisp的强大之处,不过有些东西我也不是很懂,最后两个特性我根本看不懂,尽量翻译吧。

Lisp防BUG的利器:
1.函数式编程
函数式编程是一种编程的数学方法,这种方法给程序员很多的限制,但是可以生产出非常优雅的代码。使用函数式编程时函数只能使用以下3钟变量:参数,函数内部生成的局部变量,常量。并且函数式编程不允许函数有副作用,也就是说函数不能写到磁盘,输出到屏幕或者做除了返回结果之外的任何事。函数式编程的目标就是尽量使用函数式的代码,但是一些非函数式的函数有时也是必要的。(好处:由于影响函数结果的因素只有传递给他的变量,所以非常好调试,无论你运行多少次,只要你传递的参数是一样的,那么你得到的返回值也是一样的。坏处:由于编写软件时写一些有副作用的代码是必要的,所以你不可能写出完全是函数式编程的软件,至少会有一部分是非函数式的。)

2.宏
真正的宏是lisp最独特也是最优秀的特性之一。事实上,lisp程序员写这么多烦人的括号就是因为这些括号造就了lisp的宏系统。真正的宏允许你从底层给lisp增加新功能,资深的lisp程序员能用宏让他们的lisp编译/解释器编译得更加优雅。(缺点:过度地使用宏会让你的程序难以理解。)

3.restart机制
正确的异常处理十分困难,有两种解决方案:根本不处理异常,当异常产生直接让你的程序终止,或者处理所有的异常。即使在函数调用栈底端的函数处理了发生的某些异常,程序仍然要面对很多难以解决的问题——有些调用错误有些又没有,而Common Lisp提供了一个解决异常的机制:restart。restart机制类似于一些函数可以事先声明“如果我出错那么可以调用我的重启函数,让我安全的完成工作”,其他的函数如果捕捉到异常就可以解决异常并且重启出现异常的函数。有了重启机制当程序停止运行并且退回到REPL时,程序员可以修复异常,然后尝试所以可能的重启函数,这样就能不结束程序直接重启程序。(缺点:虽然Common Lisp有最好的异常处理系统,但仍然难以处理所有的异常,但是restart机制给了你独特的能力处理运行时的异常,并让程序不终止地继续运行,这在其他语言中根本不可能。)

4.通用的setter
如果要在Common Lisp中修改一个变量的值你可以使用setf。然而这个命令有特殊的能力:除了一个变量的名字之外你也可以传递给他一个复杂的取值表达式,它就可以转变那表达式的形式,并且使用它来改变值,这样的表达式就叫做通用的setter。除了setf还有很多命令支持通用setter,这样大部分的数据结构就可以不用特殊制定一个setter函数了。(优点:当你要处理一个复杂的数据结构时,要取得值往往比要修改值便于理解,因为如果你想改变一个值就需要你理解那个数据结构并且想出一个设置值的办法,但是一旦有了通用setter,你就可以让lisp处理这些问题。缺点:由于setf修改了已经存在的数据结构,所以通用setter违反了第一条:函数式编程,这也意味着你不能在纯函数式编程中使用它。)

5.domain-specific languages(特定领域语言)
由于lisp有极其简单的语法,所以它非常适合构造你自己编程语言,这些特定领域语言会使用很多lisp的宏系统,它们代表了使用宏编程的极端形式。(缺点:由于整个编程语言都是由你自己创建的,所以一不小心就会出bug,并且这也会非常容易产生一些别人难以理解的代码。)

6.CLOS(Common Lisp对象系统)
Common Lisp有最优秀的面向对象编程框架——CLOS。它可以使用元对象协议在最底层进行个性化。(优点:面向对象编程是一个防bug的常用技术。通过将代码写成面向对象形式的,你可以将程序分为不相关的几个部分,这样做的好处就是程序仅仅只是逻辑上相连,所以你可以独立地测试。缺点:对于面向对象编程的批评主要是这种编程方式强迫人们将数据分散地放在不同的地方,这样会使程序变得难以理解,特别是数据经常改变的地方,因此Lisp程序员更加喜欢函数式编程而非面向对象编程虽然这两种方式可以混合使用。)

7.continuation(延续,在Scheme中有支持,在Common Lisp中可以用CPS或者特定的库来实现有限的支持)
在19世纪70年代,一个特殊的lisp方言诞生了,这个方言的特性就是所谓的continuation。这种技术让你可以在代码中进行时间旅行,意思就是它能让你的代码回溯到以前的状态。这种特性在不确定性编程中非常有用。在不确定性编程中,你的代码可能会面对多种选择去做一件事,如果尝试了某种选择后发现不适合,那么这种技术可以让你的代码回溯到以前的状态并且尝试另一种选择。(优点:在你的代码中进行时间旅行常常是非常有吸引力的,这可以让你的代码非常易于理解。缺点:continuation是如此优秀的特性,甚至它连缺点都没有,真正的缺点是它会让语言的设计者头疼,因为这种特性太难以实现了,所以少有语言支持这种方法,而Scheme恰好是其中之一。)

8.brevity(简短,在Arc中有支持,在Common Lisp中可以使用特定的宏来间接支持)
Lisp允许你写一些非常简单的代码,但是又不像Perl那么难看,正是由于上面我们提到的各种特性才让这变得可能。

展开全文


推荐文章

猜你喜欢

附近的人在看

推荐阅读

拓展阅读

对“430页之后漫画部分的翻译”的回应

[已注销] 2011-07-07 16:29:50

好……

[已注销] 2011-07-07 16:10:55

为什么我搜land of lisp download就杯具了……为什么……为什么……

邻家のR君 2011-07-07 16:07:22

反正我是很多都没看懂……我直接在Google搜的land of lisp pdf,可以找到很多

[已注销] 2011-07-07 13:39:18

2、5、6其实是一个意思,8不懂……
另外,这本书是从哪里弄到的?好难找。