ACL阅读笔记



忽然间又发现这里了,两个月前看到时只有两章,现在已经四章了。翻译者还在辛勤地努力工作着,大致看看比pcl基础一些,看过pcl前十章回头再看这些东西,收获良多。

前言


总之感觉Lisp不会像其它语言一样让你受限于工具,它是无所不能的......(勿喷,个人理解)

欢迎来到Lisp


Summary


  1. Lisp 是一种交互式语言。如果你在顶层输入一个表达式, Lisp 会显示它的值。
  2. Lisp 程序由表达式组成。一个表达式可以是原子,或一个由操作符跟着零个或多个参数的列表。前序表示法意味着操作符可以有任意数目的参数。
  3. Common Lisp 函数调用的求值规则: 对参数从左至右求值,然后把它们的值传入由操作符表示的函数。 quote 操作符有自己的求值规则,它逐字不变地返回参数。
  4. 除了平常的资料类型, Lisp 有符号与列表。因为 Lisp 程序是用列表来表示的,很简单写出能编程的程序。
  5. 三个基本的列表函数是 cons ,它创建一个列表; car ,它返回列表的第一个元素; 和 cdr ,它返回第一个元素之后的所有东西。
  6. 在 Common Lisp 中, t 表示 真 ,而 nil 表示 假 。在逻辑的语意中,任何不为 nil 的东西都视为 真 。基本的条件式是 if 。 and 与 or 是相似的条件式。
  7. Lisp 主要由函数所组成。你可以用 defun 来定义新的函数。
  8. 一个调用自己的函数是递归的。一个递归函数应该要被视为过程,而不是机器。
  9. 括号不是问题,因为程序员藉由缩排来阅读与编写 Lisp 程序。
  10. 基本的 I/O 函数是 read ,它包含了一个完整的 Lisp 语法分析器,以及 format ,它基由模版来产生输出。
  11. 你可以用 let 来创造新的局域变量,用 defparameter 来创造全域变量。
  12. 赋值操作符是 setf 。它的第一个参数可以是一个表达式。
  13. 函数式编程,意味着避免产生副作用,是 Lisp 的主导思维。
  14. 基本的迭代操作符是 do 。
  15. 作为一般 Lisp 对象的函数。它们可以被当成参数传入,并可以用 lambda 表达式来表示。
  16. 在Lisp 中,数值有类型,而不是变量。

my extract


习题答案个人版


;1.a
14
;1.b
(1 5)
;1.c
7
;1.d
(nil 3)
;2.
(cons a (cons b (cons c nil)))
;3.
(defun my-fourth (lst)
(car (cdr (cdr (cdr lst)))))
;4.
(defun my-max (x y)
  (if (> x y) x y))
;5.a
;;检查列表中是否有nil
;5.b
;;返回第一个参数(元素)在第二个参数(列表)中的位置
;6.a
car
;6.b
or
;6.c
apply
;7
(defun contain-list (lst)
  (if (null lst)
    nil
    (or (listp (car lst))
        (contain-list (cdr lst)))))
;8.a
;;Iteration
(defun plotdot (num)
  (do ((i 1 (+ i 1)))
    ((> i num) 'done)
    (format t ".")))
;;Recursive
(defun plotdot-r (num)
  (if (= num 0)
    'done
    (progn
      (format t ".")
      (plotdot-r (- num 1)))))
;8.b
;;Iteration
(defun a-times (lst)
  (let ((times 0))
  (dolist (obj lst)
    (if (eql obj 'a)
    (setf times (+ times 1))))
    times))
;;Recursive
(defun a-times-r (lst)
  (if (null lst)
    0
    (if (eql 'a (car lst))
    (+ (a-times-r (cdr lst)) 1)
    (a-times-r (cdr lst)))))
;9.a
(defun summit (lst)
  (apply #'+ (remove nil lst)))
;9.b
(defun summit (lst)
  (if (null lst)
    0   
    (let ((x (car lst)))
      (if (null x)
        (summit (cdr lst))
        (+ x (summit (cdr lst)))))))

列表


Summary


  1. 一个 cons 是一个含两部分的数据结构。列表用链结在一起的 cons 组成。
  2. 判断式 equal 比 eql 来得不严谨。基本上,如果传入参数印出来的值一样时,返回真。
  3. 所有 Lisp 对象表现得像指针。你永远不需要显式操作指针。
  4. 你可以使用 copy-list 复制列表,并使用 append 来连接它们的元素。
  5. 游程编码是一个餐厅中使用的简单压缩演算法。
  6. Common Lisp 有由 car 与 cdr 定义的多种存取函数。
  7. 映成函数应用函数至逐项的元素,或逐项的列表尾端。
  8. 嵌套列表的操作有时被考虑为树的操作。
  9. 要判断一个递归函数是否正确,你只需要考虑是否包含了所有情况。
  10. 列表可以用集合表示。数个内置函数把列表当作集合。
  11. 关键字参数是选择性的,并不是由位置所识别,是用符号前面的特殊标签来识别。
  12. 列表是序列的子类型。 Common Lisp 有大量的序列函数。
  13. 一个不是正规列表的 cons 称之为点状列表。
  14. 用 cons 对象作为元素的列表,可以拿来表示对应关系。这样的列表称为关联列表(assoc-lists)。
  15. 自动内存管理拯救你处理内存配置的烦恼,但制造过多的垃圾会使程序变慢。

my extract


Specialized Data Structure


Summary


my extract


changelog

blog comments powered by Disqus

Valid XHTML 1.0 Strict This page is Vim powered