Merge pull request #439 from macdavid313/master

[common-lisp/zh-cn] Just update and correct some contents
This commit is contained in:
Nami-Doc 2013-12-11 05:54:08 -08:00
commit 4c95f6570e

View File

@ -1,10 +1,10 @@
---
Language: "Common Lisp"
Filename: commonlisp.lisp
Contributors:
Contributor:
- ["Paul Nathan", "https://github.com/pnathan"]
Translator:
- ["Mac David", "http://github.com/macdavid313"]
- ["Mac David", "http://macdavid313.com"]
---
ANSI Common Lisp 是一个广泛通用于各个工业领域的、支持多种范式的编程语言。
@ -31,9 +31,9 @@ ANSI Common Lisp 是一个广泛通用于各个工业领域的、支持多种范
t ;还是一个原子,代表逻辑真值。
(+ 1 2 3 4) ; 一个S表达式。
(+ 1 2 3 4) ; 一个S-表达式。
'(4 :foo t) ;同样是一个S表达式。
'(4 :foo t) ;同样是一个S-表达式。
;;; 注释
@ -146,7 +146,7 @@ nil ; 逻辑假,或者空列表
(defparameter *AΛB* nil)
;; 访问一个在之前从未绑定的变量是一种不规范的行为(即使依然是可能发生的);
;; 访问一个在之前从未绑定的变量是一种不规范的行为(即使依然是可能发生的);
;; 不要尝试那样做。
@ -211,7 +211,7 @@ nil ; 逻辑假,或者空列表
;;; 向量
;; 向量的字面意义是一个定长数组(译者注:此处所谓字面意义的,即为#(......)的形式,下文还会出现)
;; 向量的字面意义是一个定长数组(译者注:此处所谓“字面意义”,即指#(......)的形式,下文还会出现)
#(1 2 3) ; => #(1 2 3)
;; 使用`concatenate`来将两个向量首尾连接在一起
@ -282,10 +282,12 @@ nil ; 逻辑假,或者空列表
(gethash 'a *m*) ; => 1, t
;; 注意此处有一细节Common Lisp的`gethash`往往会返回两个值。
;; 译者注返回的第一个值表示给定的键所对应的值或者nil第二个则表示在哈希表中是否存在这个给定的键
;;译者注返回的第一个值表示给定的键所对应的值或者nil
;;(第二个是一个布尔值,表示在哈希表中是否存在这个给定的键)
;; 例如如果可以找到给定的键所对应的值则返回一个t否则返回nil
;; 由给定的键检索一个不存在的值则返回nil译者注即第一个nil第二个nil其实是指该键在哈希表中也不存在
;; 由给定的键检索一个不存在的值则返回nil
;;译者注这个nil是第一个nil第二个nil其实是指该键在哈希表中也不存在
(gethash 'd *m*) ;=> nil, nil
;; 给定一个键,你可以指定其对应的默认值:
@ -310,7 +312,7 @@ nil ; 逻辑假,或者空列表
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; 使用`lambda`来创建一个匿名函数。
;; 一个函数总是返回其最后一个表达式的值。
;; 一个函数总是返回其形式体内最后一个表达式的值。
;; 将一个函数对象打印出来后的形式是多种多样的...
(lambda () "Hello World") ; => #<FUNCTION (LAMBDA ()) {1004E7818B}>
@ -352,7 +354,7 @@ nil ; 逻辑假,或者空列表
; => Hello, Steve, from the alpacas
;; 当然,你也可以设置关键字形参;
;; 当然,你也可以设置所谓关键字形参;
;; 关键字形参往往比可选形参更具灵活性。
(defun generalized-greeter (name &key (from "the world") (honorific "Mx"))
@ -377,7 +379,7 @@ nil ; 逻辑假,或者空列表
;;(译者注:抱歉,翻译水平实在有限,下面是我个人的补充说明)
;;`eql`在二者`eq`等价,或者同为数字与字符下相同的类型,例如同为整形数或浮点数,并且他们的值相等时,二者`eql`等价)
;; (想要弄清`eql`,其实有必要先了解`eq`)
;;可以去CLHS上分别查看两者的文档另外《实用Common Lisp编程》的4.8节也提到了两者的区别)
;;可以去CLHS上分别查看两者的文档另外《实用Common Lisp编程》的4.8节也提到了两者的区别)
(eql 3 3) ; => t
(eql 3 3.0) ; => nil
(eql (list 3) (list 3)) ; => nil
@ -455,7 +457,7 @@ nil ; 逻辑假,或者空列表
;; 所谓好的Lisp编码风格就是为了减少破坏性函数的使用防止副作用的发生。
;;(译者注:很惭愧,确实不明白原作者所说的"Mutation",即这里的“变异”到底指的是什么特性)
;;毕竟他只给了一个例子,我猜测应该是和词法变量、闭包等特性有关,还望高人指点)
;;(我猜测应该是和词法变量、闭包等特性有关,还望高人指点、修正与完善
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; 7. 类与对象
@ -501,7 +503,7 @@ nil ; 逻辑假,或者空列表
:initarg :number-of-rowers)))
;; 在REPL中对human-powered-conveyance类调用`DESCRIBE`如下:
;; 在REPL中对human-powered-conveyance类调用`DESCRIBE`后结果如下:
(describe 'human-powered-conveyance)
@ -533,7 +535,7 @@ nil ; 逻辑假,或者空列表
;; pi在Common Lisp中已经是一个内置的常量。
;; 假设我们已经知道效率值“efficiency value”和船桨数大概呈对数关系
;; 假设我们已经知道效率值“efficiency value”和船桨数大概呈对数关系
;; 那么效率值的定义应当在构造器/初始化过程中就被完成。
;; 下面是一个如何初始化实例的例子:
@ -548,15 +550,13 @@ nil ; 逻辑假,或者空列表
; => 2.7725887
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; 8. 宏
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; 宏可以让你扩展语法
;; Common Lisp并没有自带WHILE循环——所以让我们自己来为他添加一个
;; 例如,Common Lisp并没有自带WHILE循环——所以让我们自己来为他添加一个
;; 如果按照“拼装者”的直觉来看,我们会这样写:
(defmacro while (condition &body body)
@ -573,7 +573,6 @@ nil ; 逻辑假,或者空列表
;; 让我们来看看它的高级版本:
(defmacro while (condition &body body)
"While `condition` is true, `body` is executed.
@ -589,7 +588,7 @@ nil ; 逻辑假,或者空列表
;; 注意到反引号'`',逗号','以及'@'符号,这三个符号;
;; 反引号'`'是一种所谓“quasiquote”的引用类型的运算符有了它之后的逗号“,”才有意义。
;; 逗号“,”意味着解除引用unquote即开始求值“@”符号则表示将当前的参数插入到当前整个列表中。
;;(译者注:这三个符号只不过是语法糖罢了,而要想真正用好、用对,需要下一番功夫)
;;(译者注:要想真正用好、用对这三个符号,需要下一番功夫)
;;(甚至光看《实用 Common Lisp 编程》中关于宏的介绍都是不够的)
;;建议再去读一读Paul Graham的两本著作《ANSI Common Lisp》和《On Lisp》
@ -610,3 +609,6 @@ nil ; 逻辑假,或者空列表
非常感谢Scheme社区的人们我基于他们的成果得以迅速的写出这篇有关Common Lisp的快速入门
同时也感谢
- [Paul Khuong](https://github.com/pkhuong) ,他提出了很多有用的点评。
##译者寄语
“祝福那些将思想镶嵌在重重括号之内的人们。”