作者: Peter Seibel
译者: 田春
出版社: 人民邮电出版社
出版年: 2011-10
页数: 417
定价: 89.00元
装帧: 平装
ISBN: 9787115263742
内容简介 · · · · · ·
《实用Common Lisp编程》内容适合Common Lisp初学者及对之感兴趣的相关人士。
作者简介 · · · · · ·
目录 · · · · · ·
1.1 为什么是Lisp 2
1.2 Lisp 的诞生 4
1.3 本书面向的读者 6
第2 章 周而复始:REPL 简介 8
2.1 选择一个Lisp 实现 8
· · · · · · (更多)
1.1 为什么是Lisp 2
1.2 Lisp 的诞生 4
1.3 本书面向的读者 6
第2 章 周而复始:REPL 简介 8
2.1 选择一个Lisp 实现 8
2.2 安装和运行Lisp in a Box 10
2.3 放开思想:交互式编程 10
2.4 体验REPL 11
2.5 Lisp 风格的“Hello, World” 12
2.6 保存工作成果 13
第3 章 实践:简单的数据库 17
3.1 CD 和记录 17
3.2 录入CD 18
3.3 查看数据库的内容 19
3.4 改进用户交互 21
3.5 保存和加载数据库 23
3.6 查询数据库 24
3.7 更新已有的记录——WHERE 再战江湖 28
3.8 消除重复,获益良多 29
3.9 总结 33
第4 章 语法和语义 34
4.1 括号里都可以有什么 34
4.2 打开黑箱 34
4.3 S-表达式 36
4.4 作为Lisp 形式的S-表达式 38
4.5 函数调用 39
4.6 特殊操作符 39
4.7 宏 41
4.8 真、假和等价 42
4.9 格式化Lisp 代码 43
第5 章 函数 46
5.1 定义新函数 46
5.2 函数形参列表 47
5.3 可选形参 48
5.4 剩余形参 49
5.5 关键字形参 50
5.6 混合不同的形参类型 51
5.7 函数返回值 52
5.8 作为数据的函数——高阶函数 53
5.9 匿名函数 55
第6 章 变量 57
6.1 变量的基础知识 57
6.2 词法变量和闭包 60
6.3 动态变量 61
6.4 常量 65
6.5 赋值 65
6.6 广义赋值 66
6.7 其他修改位置的方式 67
第7 章 宏:标准控制构造 69
7.1 WHEN 和UNLESS 70
7.2 COND 71
7.3 AND、OR 和NOT 72
7.4 循环 72
7.5 DOLIST 和DOTIMES 73
7.6 DO 74
7.7 强大的LOOP 76
第8 章 如何自定义宏 78
8.1 Mac 的故事:只是一个故事 78
8.2 宏展开期和运行期 79
8.3 DEFMACRO 80
8.4 示例宏:do-primes 81
8.5 宏形参 82
8.6 生成展开式 83
8.7 堵住漏洞 84
8.8 用于编写宏的宏 88
8.9 超越简单宏 90
第9 章 实践:建立单元测试框架 91
9.1 两个最初的尝试 91
9.2 重构 92
9.3 修复返回值 94
9.4 更好的结果输出 95
9.5 抽象诞生 97
9.6 测试层次体系 97
9.7 总结 99
第10 章 数字、字符和字符串 101
10.1 数字 101
10.2 字面数值 102
10.3 初等数学 104
10.4 数值比较 106
10.5 高等数学 107
10.6 字符 107
10.7 字符比较 107
10.8 字符串 108
10.9 字符串比较 109
第11 章 集合 111
11.1 向量 111
11.2 向量的子类型 113
11.3 作为序列的向量 114
11.4 序列迭代函数 114
11.5 高阶函数变体 116
11.6 整个序列上的操作 117
11.7 排序与合并 118
11.8 子序列操作 118
11.9 序列谓词 119
11.10 序列映射函数 120
11.11 哈希表 120
11.12 哈希表迭代 122
第12 章 LISP 名字的由来:列表处理 123
12.1 “没有列表” 123
12.2 函数式编程和列表 126
12.3 “破坏性”操作 127
12.4 组合回收性函数和共享结构 129
12.5 列表处理函数 131
12.6 映射 132
12.7 其他结构 133
第13 章 超越列表:点对单元的其他用法 134
13.1 树 134
13.2 集合 136
13.3 查询表:alist 和plist 137
13.4 DESTRUCTURING-BIND 141
第14 章 文件和文件I/O 143
14.1 读取文件数据 143
14.2 读取二进制数据 145
14.3 批量读取 145
14.4 文件输出 145
14.5 关闭文件 146
14.6 文件名 147
14.7 路径名如何表示文件名 149
14.8 构造新路径名 150
14.9 目录名的两种表示方法 152
14.10 与文件系统交互 153
14.11 其他I/O 类型 154
第15 章 实践:可移植路径名库 157
15.1 API 157
15.2 *FEATURES*和读取期条件化 157
15.3 列目录 159
15.4 测试文件的存在 162
15.5 遍历目录树 164
第16 章 重新审视面向对象:广义函数 165
16.1 广义函数和类 166
16.2 广义函数和方法 167
16.3 DEFGENERIC 168
16.4 DEFMETHOD 169
16.5 方法组合 171
16.6 标准方法组合 172
16.7 其他方法组合 173
16.8 多重方法 174
16.9 未完待续 176
第17 章 重新审视面向对象:类 177
17.1 DEFCLASS 177
17.2 槽描述符 178
17.3 对象初始化 179
17.4 访问函数 182
17.5 WITH-SLOTS 和WITHACCESSORS 185
17.6 分配在类上的槽 186
17.7 槽和继承 187
17.8 多重继承 188
17.9 好的面向对象设计 190
第18 章 一些FORMAT 秘诀 191
18.1 FORMAT 函数 192
18.2 FORMAT 指令 193
18.3 基本格式化 194
18.4 字符和整数指令 194
18.5 浮点指令 196
18.6 英语指令 197
18.7 条件格式化 198
18.8 迭代 199
18.9 跳,跳,跳 201
18.10 还有更多 202
第19 章 超越异常处理:状况和再启动 203
19.1 Lisp 的处理方式 204
19.2 状况 205
19.3 状况处理器 205
19.4 再启动 207
19.5 提供多个再启动 210
19.6 状况的其他用法 211
第20 章 特殊操作符 213
20.1 控制求值 213
20.2 维护词法环境 213
20.3 局部控制流 216
20.4 从栈上回退 219
20.5 多值 223
20.6 EVAL-WHEN 224
20.7 其他特殊操作符 227
第21 章 编写大型程序:包和符号 228
21.1 读取器是如何使用包的 228
21.2 包和符号相关的术语 230
21.3 三个标准包 230
21.4 定义你自己的包 232
21.5 打包可重用的库 234
21.6 导入单独的名字 235
21.7 打包技巧 236
21.8 包的各种疑难杂症 237
第22 章 高阶LOOP 240
22.1 LOOP 的组成部分 240
22.2 迭代控制 241
22.3 计数型循环 241
22.4 循环集合和包 242
22.5 等价?然后迭代 243
22.6 局部变量 244
22.7 解构变量 245
22.8 值汇聚 245
22.9 无条件执行 247
22.10 条件执行 247
22.11 设置和拆除 248
22.12 终止测试 250
22.13 小结 251
第23 章 实践:垃圾邮件过滤器 252
23.1 垃圾邮件过滤器的核心 252
23.2 训练过滤器 255
23.3 按单词来统计 257
23.4 合并概率 259
23.5 反向卡方分布函数 261
23.6 训练过滤器 262
23.7 测试过滤器 263
23.8 一组工具函数 265
23.9 分析结果 266
23.10 接下来的工作 268
第24 章 实践:解析二进制文件 269
24.1 二进制文件 269
24.2 二进制格式基础 270
24.3 二进制文件中的字符串 271
24.4 复合结构 273
24.5 设计宏 274
24.6 把梦想变成现实 275
24.7 读取二进制对象 277
24.8 写二进制对象 279
24.9 添加继承和标记的结构 280
24.10 跟踪继承的槽 281
24.11 带有标记的结构 284
24.12 基本二进制类型 285
24.13 当前对象栈 288
第25 章 实践:ID3 解析器 290
25.1 ID3v2 标签的结构 291
25.2 定义包 292
25.3 整数类型 292
25.4 字符串类型 294
25.5 ID3 标签头 297
25.6 ID3 帧 298
25.7 检测标签补白 300
25.8 支持ID3 的多个版本 301
25.9 版本化的帧基础类 303
25.10 版本化的具体帧类 304
25.11 你实际需要哪些帧 305
25.12 文本信息帧 307
25.13 评论帧 309
25.14 从ID3 标签中解出信息 310
第26 章 实践:用AllegroServe 进行Web 编程 315
26.1 30 秒介绍服务器端Web 编程 315
26.2 AllegroServe 317
26.3 用AllegroServe 生成动态内容 320
26.4 生成HTML 321
26.5 HTML 宏 324
26.6 查询参数 325
26.7 cookie 327
26.8 小型应用框架 329
26.9 上述框架的实现 330
第27 章 实践:MP3 数据库 334
27.1 数据库 334
27.2 定义模式 336
27.3 插入值 338
27.4 查询数据库 340
27.5 匹配函数 342
27.6 获取结果 344
27.7 其他数据库操作 346
第28 章 实践:Shoutcast 服务器 348
28.1 Shoutcast 协议 348
28.2 歌曲源 349
28.3 实现Shoutcast 351
第29 章 实践:MP3 浏览器 357
29.1 播放列表 357
29.2 作为歌曲源的播放列表 359
29.3 操作播放列表 362
29.4 查询参数类型 365
29.5 样板HTML 367
29.6 浏览页 368
29.7 播放列表 371
29.8 查找播放列表 373
29.9 运行应用程序 374
第30 章 实践:HTML 生成库,解释器部分 375
30.1 设计一个领域相关语言 375
30.2 FOO 语言 376
30.3 字符转义 379
30.4 缩进打印器 380
30.5 HTML 处理器接口 381
30.6 美化打印器后台 382
30.7 基本求值规则 385
30.8 下一步是什么 389
第31 章 实践:HTML 生成库,编译器部分 390
31.1 编译器 390
31.2 FOO 特殊操作符 395
31.3 FOO 宏 399
31.4 公共API 401
31.5 结束语 403
第32 章 结论:下一步是什么 404
32.1 查找Lisp 库 404
32.2 与其他语言接口 406
32.3 让它工作,让它正确,让它更快 406
32.4 交付应用程序 413
32.5 何去何从 415
· · · · · · (收起)
豆瓣成员常用的标签(共33个) · · · · · ·
喜欢读"实用Common Lisp编程"的人也喜欢 · · · · · ·
按有用程度 按页码先后 最新笔记
-
第10页
Dexter.Yy (Defensive pessimist)
既想体验REPL又不想把自己宝贵青春中的任何一秒浪费在emacs上的vim用户可以安装slimv.vim("SLIME for Vim"): http://www.vim.org/scripts/script.php?script_id=2531 包含: lisp和clojure的缩进规则 lisp、scheme和clojure的文件类型、语法高亮规则 Paredit(emacs上处理括弧的神器)的vim版本 自动侦测lisp环境 slime和swank(也提供swank-clojure) 作者写的tutorial:http://kovisoft.bitbucket.... (更多)既想体验REPL又不想把自己宝贵青春中的任何一秒浪费在emacs上的vim用户可以安装slimv.vim("SLIME for Vim"):http://www.vim.org/scripts/script.php?script_id=2531包含:lisp和clojure的缩进规则lisp、scheme和clojure的文件类型、语法高亮规则Paredit(emacs上处理括弧的神器)的vim版本自动侦测lisp环境slime和swank(也提供swank-clojure)作者写的tutorial:http://kovisoft.bitbucket.org/tutorial.html作者说是开箱即用的,不需要改vimrc,但在MAC OS X上难免有一些坑爹的问题要解决……1、common lisp的实现有两个选择—SBCL和Clozure CL,前者更流行,后者起源于mac平台对Cocoa支持更好,如果选后者,slimv.vim会侦测不到,需要在vimrc里手动设置:let g:slimv_swank_cmd = '!osascript -e "tell application \"Terminal\" to do script \"ccl --load ~/.vim/slime/start-swank.lisp\""'
注意设置g:slimv_lisp是没用的……2、编辑lisp文件时,菜单栏会增加slimv和大量交互命令,同时映射一批快捷键,但都是“,” + 单字母,如果<leader>也是“,”就会严重冲突,需要改g:slimv_leader,比如let g:slimv_leader = ",l"3、在vim上实现REPL环境的原理是在Terminal里跑swank server,把lisp交互模式下的标准输入输出都通过socket 127.0.0.1:4005传到vim的buffer,这个部分是用python写的vim脚本(所以OS X集成的vim因为没包含python是不支持slimv的),问题出在macvim,当前的64位版本在运行python时会崩溃……所以只能重新编译一个32位的:./configure --with-features=huge \ --enable-rubyinterp \ --enable-pythoninterp \ --enable-perlinterp \ --enable-cscope \ --with-macsdk=10.7 \ --with-macarchs=i386UPDATE:刚刚发现最新的Snapshot 63已经改回32位了:https://github.com/b4winckler/macvim/wiki/ChangeLog (收起)2011-11-19 05:02:06 1回应
-
译者序
译者序 我很荣幸被授权翻译《Practical Common Lisp》一书,本书是自1994年Common Lisp语言标准化以来国内出版的第一本Common Lisp的中文教材。 Lisp语言家族最早诞生于1959年,它是人类历史上第二个高级程序设计语言(第一个是Fortran)。那一年人工智能(AI)专家John McCarthy发表了具有重大历史意义的第一篇LISP论文:《Recursive Functions of Symbolic Expressions and their Computation by Machine, Part I》,其中.. (更多)译者序我很荣幸被授权翻译《Practical Common Lisp》一书,本书是自1994年Common Lisp语言标准化以来国内出版的第一本Common Lisp的中文教材。Lisp语言家族最早诞生于1959年,它是人类历史上第二个高级程序设计语言(第一个是Fortran)。那一年人工智能(AI)专家John McCarthy发表了具有重大历史意义的第一篇LISP论文:《Recursive Functions of Symbolic Expressions and their Computation by Machine, Part I》,其中介绍了一种运行在古老的IBM 704计算机上的列表处理语言LISP(LISt Processing,列表处理),借助它可以轻松描述当时人工智能领域用到的各种算法。从此,Lisp语言在包括AI领域在内的所有主流计算机分支上都获得了长足的发展,Lisp平台不但在IBM PC出现之前的几乎所有计算机硬件体系上均有移植,甚至在80年代还出现过专门用来运行Lisp程序的硬件——Lisp机。1994年ANSI标准化的Common Lisp语言将之前历史上的所有现存Lisp厂商的各种语言和平台特性做了一次伟大的总结,从此语言核心不再变化,不但标准化以前的历史遗留代码只通过少量修改就可以兼容现代Lisp平台,而且标准化以后写出的所有新代码也都几乎不经任何调整就可能运行在任何一种Common Lisp平台上,无论是带有原生或是字节码编译器的,还是间接转译成C语言的,或是运行在JVM上的。目前至少有13种不同的Common Lisp语言平台可以运行在现代计算机上,其中10种还在广泛使用中,远超过它们所在的操作系统上C和其他语言编译器的数量。可以说Lisp语言家族长达50年的发展史就是整个计算机发展史的缩影。我从2003年大学三年级时开始学习Common Lisp语言,至今已有八个年头。当时学习它的动机基本上是出于对人工智能(传统的逻辑和推理、知识表示等方向)的个人兴趣。不过随后很快就发现,Common Lisp是一门通用的编程语言,如果不考虑其历史渊源而只从语言本身的特性来观察的话,它跟人工智能可以说是毫无关系。在《Practical Common Lisp》一书中,作者Peter Seibel也将谈到这个问题。当今有太多的人对Lisp语言存在类似的误解,包括相当多的学过早期Lisp语言的人头脑中还停留在列表(List)是Lisp语言的唯一复合数据类型的认识上。如果读者从头到尾学完了这本书,就会发现Common Lisp是一门特性丰富的大型编程语言,不但提供了现代编程语言普遍支持的各种数据类型(包括各种数值类型、字符串、数组、结构体和哈希表在内),还支持几乎所有的编程范式(面向过程的、函数式的,以及面向对象的),尤其带有一套特性丰富且思想独到的面向对象编程接口CLOS (Common Lisp Object System)和OO扩展接口MOP (Meta-Object Protocol)。如果要用一句话来描述Common Lisp中的OO与C++/Java/SmallTalk等语言的OO有何不同,那就是Common Lisp对象系统完全不是基于消息传递的,而是基于广义函数的。有兴趣的读者应当仔细阅读本书的第16和17两章,其中介绍了CLOS的一些入门内容。不过Lisp语言最吸引人的地方还在于其与众不同的程序运行方式。从C语言一路学过来的人往往把一门语言的语法及其标准函数库视为语言的全部,因为一旦程序写好,编译器就会将整个代码编译成一个可执行程序或者被其他可执行程序使用的库。接下来语言本身是什么就不重要了,重要的是程序员写出了什么功能。甚至连编译器本身是什么都不重要,因为它只是一个黑箱,除了简单的优化开关之外几乎无法调整其行为。各种Lisp语言则采用完全不同的方式来运行Lisp程序:Lisp平台本身是一个交互式的环境,它在很大程度上就是用其本身写成的。用户的Lisp代码以编译或解释的形式加载到Lisp环境中,然后跟Lisp语言或平台本身的代码直接融合在一起。换句话说,每一个Lisp程序都是对Lisp语言本身的某种形式的扩展。然后通过一个启动函数,整个程序得以运行。听到这里,读者似乎看到了Python或者Ruby的影子,但Lisp环境还有更绝的地方:几乎所有Lisp平台都允许用户将加载了用户代码的整个环境从内存中导出(dump)为一个磁盘文件。通过直接加载这个文件而不是默认的那个只含有Lisp本身的文件,可以迅速地重建导出前的Lisp环境,从而达到增量开发或者哪怕是快速加载已有Lisp程序的目的。最后,和其他语言很不同的一点是,Lisp语言规范(至少Common Lisp是这样的)不但包括了如何定义某个程序组成部分(指的是变量、函数和类这些东西)的能力,还定义了从Lisp环境中清除任何程序组成部分以及就地修改它们的能力,并在语义和功能上确保了这些操作不会破坏运行中的Lisp代码。这导致了Lisp语言的另一个重要应用:通过加载补丁,Lisp系统可以在运行中被任意修改,这对24×7的服务端程序的平滑升级尤为有利。顺便说一句,Lisp也是最早引入垃圾收集(GC)机制的编程语言,Lisp环境中的任何对象,一旦失去了来自其他对象的引用,就会在某个时刻被GC系统从内存中清除掉。读者可能已经注意到了我在不停地混用Lisp和Common Lisp两个概念。这有两层含义:首先,存在Common Lisp之外的Lisp语言,更准确地说是Lisp方言(dialect),这至少包括了Emacs Lisp、AutoLISP、Scheme、Racket(前身是PLT Scheme)和Clojure,其中最后一个是高速发展中的新兴Lisp方言;其次,所有Lisp家族的语言都有很多共性,除了上面描述中带有Lisp而非Common Lisp字样的部分以外,还有最大的也是初学者最容易看到的一点,那就是所有Lisp方言都使用前缀表达式和用小括号表示的列表,例如 1+1 在Lisp中将写成(+ 1 1)。很多初学者一开始都不适应前缀表达式,但我认为前缀表达式是有很多优点的:首先它彻底消除了运算符结合性问题,令表达式毫无歧义可言;其次它让语言处理器更加简单高效,避免了语法分析的困难。当然,一旦习惯了也就感觉没什么了。学习本书对更好地使用其他Lisp方言无疑是大有帮助的。在翻阅书店里关于AutoLISP(AutoCAD计算机辅助设计软件的扩展语言)的各种书籍时,我经常痛心疾首地发现这些图书的作者虽然精通AutoCAD所提供的Lisp编程接口,但写出的AutoLISP代码要么极为难看,要么缺乏效率、滥用内存。AutoLISP在语法上跟Common Lisp非常接近,本书的大部分内容都适用于AutoLISP。因此我强烈推荐所有AutoLISP程序员阅读本书以加强自身的Lisp素养。同样的问题对于Emacs Lisp(GNU Emacs文本编辑器的扩展语言)来说也是一样的。Scheme系的Lisp方言区别相对大一些,如果连基本的变量和函数定义都在形式上完全不同的话(当然,思想上是没什么本质区别的),我恐怕初学者从本书中学得Scheme编程思想的机会不大,这种情况下还是推荐《计算机程序的构造和解释》、《Lisp in Small Pieces》和《The Little Schemer》等书籍比较好。本书可以作为其他Common Lisp语言教材的学习基础。在本书的最后一章里,作者给出了很多后续的教材,在此就不一一重复了。需要特别指出的是,另一本著名的Common Lisp教材《On Lisp》(作者Paul Graham,也就是《黑客与画家》一书的作者)多年前已经被我和我的几位朋友共同翻译成中文版,细心的读者将可以从网上轻易地找到它。《On Lisp》主要介绍Common Lisp的宏编程,这是Common Lisp区别于其他语言甚至其他Lisp方言的最重要特性。我相信一旦读者掌握了本书中关于宏的章节以后就可以阅读《On Lisp》中的进阶内容,从而将自身对编程语言的认识上升到一个新的高度,不过更加符合实用原则的思路还是先把本书读完。Common Lisp绝不是一门过时的编程语言,整个Common Lisp社区一直都在高速的发展之中,近几年的发展尤为迅速。在我学习Common Lisp的这些年里,我亲眼目睹了几个Common Lisp平台从无到有(ECL、ABCL)或者发展壮大(SBCL、Clozure CL)的过程。经典平台(CMUCL、MCL)也得到了良好的维护并始终跟进操作系统的自然发展。随着计算机硬件的高速发展,即便相对保守的Common Lisp商业平台也开始或即将开始支持对称多处理器(SMP),其中LispWorks和Scieneer CL都以SMP支持作为主要卖点。第三方软件包长足发展,虽然尚未达到Perl社区CPAN的水平,但常用的工具包一应俱全,其中不乏高质量的大型项目。近年来最新的成果Quicklisp包管理平台,更是将Common Lisp第三方软件包的安装过程提升到了前所未有的便捷程度。免费平台越来越好,商业平台依然昂贵,开源工具蓬勃发展,所有这些都暗示着Common Lisp语言还保持着旺盛的生命力,唯一的问题是如何让更多的国内计算机领域爱好者了解它。这就是我翻译本书的目的所在。过去8年里,我一直活跃在国内和国际Common Lisp社区的前沿。我在大学本科的最后两年学完了Common Lisp语言语法的主要部分,读完了包括本书在内的几本最经典的Lisp书籍,并已经能够在当时最常见的CMUCL平台(CMU Common Lisp)上编写一些简单的程序;后来在网易工作的五年里,我在工作之余从头研究了一遍Lisp语言的发展史,亲身体会了包括Lisp机在内的十几种不同的Common Lisp平台或实现,并自费购买了价值数千美元的商业开发环境LispWorks,拥用三种主流操作系统上的License。在网易从事Linux系统管理工作期间,我用Common Lisp从头实现了一万行源代码规模的SNMP简单网络管理协议工具包,它可以为任何服务器端Common Lisp程序添加通过SNMP协议进行远程监控的能力,也可以作为基于Common Lisp的网络监控系统的基础。我还在过去3年里参与维护了Common Lisp社区两个最重要的可移植网络库之一:usocket,并由于SNMP库的需要将其从原本只支持TCP扩展到了同时支持UDP,其中对于LispWorks的UDP支持代码是完全从头写的,因为官方并不支持。2009年,我向国际Lisp会议的投稿被接受,并作为会议论文集的一部分出版;我是长期担任水木社区函数型编程版的版主之一,专门负责Lisp方向的讨论和技术分享。2011年7月,我离开网易以后开始全职从事商业Lisp软件相关的开发工作。可能我还不是一个很好的译者,但作为一个经验丰富的Common Lisp程序员,我相信自己翻译这本书是合适的。计算机领域每天都在高速发展,新语言和新技术的产生速度早已超过了一般人的学习速度。对于一个计算机领域的从业人员或爱好者来说,学习通常是为了更好地应用,把所有时间都用来学习而无暇具体应用也是本末倒置。在这种情况下,有选择地学习最有用、最不易变质的知识,以及甄别各种计算机知识的重要程度和相互关系的能力就显得非常重要了。从计算机语言的发展历史来说,如果一门语言可以存活50年,那么它的内在生命力很可能保证其继续长期存活下去,一个人用这门语言写下的代码也将比其他语言的代码更有可能长久地造福后人。总之,希望这本书能将读者顺利带入Lisp领域。学习一门新的语言总是要花些成本的,但我想说,和其他任何语言相比,花在理解Lisp上的时间和精力将绝对是物超所值的,即便相当多的读者可能没有机会在短期内将Lisp用于他们的日常工作。之所以这样说是有原因的:C和Lisp是编程语言的两个极端,大多数人已经熟悉了C的那一端,但如果他们还熟悉另一端的话,那么迅速理解几乎所有其他的编程语言将不再是问题。 (收起)2011-11-08 08:45:58 回应
-
第120页
leegorous (无浴则缸)
REDUCE 函数非常有用,无论何时,当需要将一个序列提炼成一个单独的值时,你都有机会用 REDUCE 来写它,而这通常是一种相当简洁的表达意图的方法。例如,为了找出一个数字序列中的最大值,可以写成 (reduce #‘max numbers)。 (更多)
(收起)REDUCE 函数非常有用,无论何时,当需要将一个序列提炼成一个单独的值时,你都有机会用 REDUCE 来写它,而这通常是一种相当简洁的表达意图的方法。例如,为了找出一个数字序列中的最大值,可以写成 (reduce #‘max numbers)。
2012-01-24 17:50:14 回应
-
第1页
ambar (我追寻彩虹,看时光流转。)
经过了五年,才发现 douban 有写笔记功能。 书买了一个多月,才在昨晚入睡之时看了四十多页。 前面一部分有 JavaScript 基础的话,看下来觉得很相似,到四十页左右看到宏才觉得 lisp 很精彩。 ---- 误了,google 一下,证实豆瓣笔记功能在我今年生日那天才推出 > http://blog.douban.com/douban/2011/01/24/1369/ (更多)经过了五年,才发现 douban 有写笔记功能。书买了一个多月,才在昨晚入睡之时看了四十多页。前面一部分有 JavaScript 基础的话,看下来觉得很相似,到四十页左右看到宏才觉得 lisp 很精彩。----误了,google 一下,证实豆瓣笔记功能在我今年生日那天才推出 > http://blog.douban.com/douban/2011/01/24/1369/ (收起)2011-12-14 19:49:17 回应
-
第10页
Dexter.Yy (Defensive pessimist)
既想体验REPL又不想把自己宝贵青春中的任何一秒浪费在emacs上的vim用户可以安装slimv.vim("SLIME for Vim"): http://www.vim.org/scripts/script.php?script_id=2531 包含: lisp和clojure的缩进规则 lisp、scheme和clojure的文件类型、语法高亮规则 Paredit(emacs上处理括弧的神器)的vim版本 自动侦测lisp环境 slime和swank(也提供swank-clojure) 作者写的tutorial:http://kovisoft.bitbucket.... (更多)既想体验REPL又不想把自己宝贵青春中的任何一秒浪费在emacs上的vim用户可以安装slimv.vim("SLIME for Vim"):http://www.vim.org/scripts/script.php?script_id=2531包含:lisp和clojure的缩进规则lisp、scheme和clojure的文件类型、语法高亮规则Paredit(emacs上处理括弧的神器)的vim版本自动侦测lisp环境slime和swank(也提供swank-clojure)作者写的tutorial:http://kovisoft.bitbucket.org/tutorial.html作者说是开箱即用的,不需要改vimrc,但在MAC OS X上难免有一些坑爹的问题要解决……1、common lisp的实现有两个选择—SBCL和Clozure CL,前者更流行,后者起源于mac平台对Cocoa支持更好,如果选后者,slimv.vim会侦测不到,需要在vimrc里手动设置:let g:slimv_swank_cmd = '!osascript -e "tell application \"Terminal\" to do script \"ccl --load ~/.vim/slime/start-swank.lisp\""'
注意设置g:slimv_lisp是没用的……2、编辑lisp文件时,菜单栏会增加slimv和大量交互命令,同时映射一批快捷键,但都是“,” + 单字母,如果<leader>也是“,”就会严重冲突,需要改g:slimv_leader,比如let g:slimv_leader = ",l"3、在vim上实现REPL环境的原理是在Terminal里跑swank server,把lisp交互模式下的标准输入输出都通过socket 127.0.0.1:4005传到vim的buffer,这个部分是用python写的vim脚本(所以OS X集成的vim因为没包含python是不支持slimv的),问题出在macvim,当前的64位版本在运行python时会崩溃……所以只能重新编译一个32位的:./configure --with-features=huge \ --enable-rubyinterp \ --enable-pythoninterp \ --enable-perlinterp \ --enable-cscope \ --with-macsdk=10.7 \ --with-macarchs=i386UPDATE:刚刚发现最新的Snapshot 63已经改回32位了:https://github.com/b4winckler/macvim/wiki/ChangeLog (收起)2011-11-19 05:02:06 1回应
-
第21页
leegorous (无浴则缸)
“从技术上来讲,也可以使用 FORMAT 在整个数据库本身上循环,从而将 dump-db 函数变成只有一行。 (defun dump-db () (format t "~{~{~a: ~10t~a~%~}~%~}" *db*)) 这件事究竟算酷还是恐怖,完全看你怎么想。” (更多)“从技术上来讲,也可以使用 FORMAT 在整个数据库本身上循环,从而将 dump-db 函数变成只有一行。(defun dump-db () (format t "~{~{~a: ~10t~a~%~}~%~}" *db*))这件事究竟算酷还是恐怖,完全看你怎么想。” (收起)2011-12-07 20:55:05 回应
-
第120页
leegorous (无浴则缸)
REDUCE 函数非常有用,无论何时,当需要将一个序列提炼成一个单独的值时,你都有机会用 REDUCE 来写它,而这通常是一种相当简洁的表达意图的方法。例如,为了找出一个数字序列中的最大值,可以写成 (reduce #‘max numbers)。 (更多)
(收起)REDUCE 函数非常有用,无论何时,当需要将一个序列提炼成一个单独的值时,你都有机会用 REDUCE 来写它,而这通常是一种相当简洁的表达意图的方法。例如,为了找出一个数字序列中的最大值,可以写成 (reduce #‘max numbers)。
2012-01-24 17:50:14 回应
-
第107页
leegorous (无浴则缸)
Common Lisp 字符和数字是不同类型的对象。本该如此——字符不是数字,而将其同等对待的语言当字符编码改变时(比如说从8位 ASCII 到 21 位 Unicode)可能会出现问题。 有趣的是注脚的内容: 甚至像 Java 也会产生问题,它基于 Unicode 注定将成为未来主流字符编码这一理论,而从一开始就被设计使用 Unicode 字符。产生问题是因为 Java 字符被定义为 16 位值,而 Unicode 3.1 标准将 Unicode 字符集范围拓展到了需要 21 位表... (更多)
有趣的是注脚的内容:Common Lisp 字符和数字是不同类型的对象。本该如此——字符不是数字,而将其同等对待的语言当字符编码改变时(比如说从8位 ASCII 到 21 位 Unicode)可能会出现问题。
(英文原文是 Ooops) (收起)甚至像 Java 也会产生问题,它基于 Unicode 注定将成为未来主流字符编码这一理论,而从一开始就被设计使用 Unicode 字符。产生问题是因为 Java 字符被定义为 16 位值,而 Unicode 3.1 标准将 Unicode 字符集范围拓展到了需要 21 位表示。太惨了。
2012-01-20 12:35:18 1回应
-
第106页
leegorous (无浴则缸)
在试验数值比较的时候,发现一个奇怪的东西 /代码内容已省略/ 但是,当不涉及到小数的时候是一切正常的 /代码内容已省略/ 而且,带小数总是大于用分数形式表达的。 从形式上很难看出来是什么问题。函数 = 是用数学意义上的值来比较数字,而忽略类型上的区别。这么说,就是带小数的浮点数的数学意义值比理论上等值的分数的要大。 (更多)在试验数值比较的时候,发现一个奇怪的东西CL-USER> (= 0.2 1/5) NIL CL-USER> (> 0.2 1/5) T CL-USER> (< 0.2 1/5) NIL
但是,当不涉及到小数的时候是一切正常的CL-USER> (= 1.0 1) T CL-USER> (= 1.0 10/10) T
而且,带小数总是大于用分数形式表达的。从形式上很难看出来是什么问题。函数 = 是用数学意义上的值来比较数字,而忽略类型上的区别。这么说,就是带小数的浮点数的数学意义值比理论上等值的分数的要大。 (收起)2012-01-19 22:44:50 回应
书评 · · · · · · (共11条)
我来评论这本书
-
最有用的好评
-
最有用的中差评
是我心太浮躁还是翻译的晦... 7/10有用
热门评论 最新评论
学习一门能够改变思想的语言
-
- kraft(stay hungry, stay foolish) Lisp 作为经典的黑客语言,日久弥新。对lisp 我想补充几点, 1 应该是lisp中首先提出垃圾回收机制; 2 lisp 的java 平台版本clojure也很火; 3 作为函数编程语言鼻祖 影响深远,尤其在现在硬件高度发达的情况下优点非常突出。 lisp 关注者相对于其他语言确实小众了一些,销量估...... (1回应)2011-10-26 3/3有用
是我心太浮躁还是翻译的晦涩
-
- Zephyro 我知道这样说对辛苦翻译的作者很不公平,但我还是要客观地说出我的看法。 我看到第十七章时实在是无法忍了。本身自己之前积累的LISP基础也就包括了基本的语法使用,此书前些的章节,不通顺的语句凑合着自己的理解也就读懂了。但是实在是乏力啊... ...靠着老本终有倒下的一天。 看书的目的毕竟是学习而不是复习。不夸张的说,这...... (6回应)2011-10-20 7/10有用
英文不好的就凑合的受折磨吧
-
- 非鱼 整本书的翻译略高于google翻译的水平。对英文不好,需要用google翻译帮助的人,买这本书可以省点麻烦。 书中有几点令我很郁闷: 1、经常少括号。对于初学的我,简直就是噩梦。 2、对于一些语法符号的解释,没办法看懂。完全是所谓的对着英文一个个翻译的感觉。例如:关于宏中, @符号......2011-10-28 2/2有用
这书真的适合入门么?
-
- 祯(迷上管风琴了) 本人是刚开始学lisp,看到第十章,虽然对lisp有了一些概念,但是还是觉得一头雾水. 好歹也学用编程有些年头了,感觉不太正常. 不知道是翻译的问题,书的问题,还是本身lisp就是这么与众不同. 从这边书的结构来看,和一般的教材不大一样,开头三章基本上都是和lisp语法不太相关的东西.第四章才开始进入编...... (7回应)2011-10-17 1/1有用
即使当成小说读也很有意思
-
- Eric. Z. LIU 已经很久没有看过编程语言的教科书了. 上一本还是c++ primer. 虽然作者讲的清楚明了, 但是还是稍显枯燥. 这本书让我感觉是在讲lisp的故事一样. 作者不愧曾经是从事英语 写作的专业人员. 读起来很舒服. 讲解的也够清楚. 比如第一次提到宏的时候有说: I can't emphasize en......2011-11-06 来自 Apress2005版
书很好,但不太利于初学者通顺阅读。
-
- 水里有谁(恍如隔世) 这本书叫实用编程,是从实用角度来写的,里面的内容也很实用。 不过虽然作者在书里写了一些入门基础知识,但从整本书的结构上来看,很不利于学习lisp语言。 首先,基础知识诸如数据类型等说明很偏后,而且并不详尽,主次也不分明。 其次,很多函数和宏第一次出现是不加说明的...... (8回应)2011-10-29
"实用Common Lisp编程"的论坛 · · · · · ·
| 这个书的作者就是从网易离职的那位吗? | 来自timger | 9 回应 | 2011-12-29 |
| 这书怎么样?【10月中下旬上市】 | 来自图灵教育-晓敏 | 6 回应 | 2011-10-25 |
| common lisp里的动态变量不是动态作用域?? | 来自hell2pradise | 2 回应 | 2011-12-06 |
| 看过部分英文原版 很不错的书 | 来自光落寞++ | 2011-09-27 | |
| 尼玛,够贵的。 | 来自G_will | 3 回应 | 2011-10-14 |
在哪儿买这本书? · · · · · ·
- > 点这儿转让 有255人想读,手里有一本闲着?
这本书的其他版本 · · · · · · ( 全部2 )
- Apress版 2005-4-11 / 72人读过
以下豆列推荐 · · · · · · (全部)
谁读这本书?
喜欢这本书的人关注的活动 · · · · · ·
订阅关于实用Common Lisp编程的评论:
feed: rss 2.0











