学了几章Practical LISP(Practical Common Lisp), 大概悟出LISP的两大优势:
1 LISP作为函数式编程(function programming), 其函数具有很低的耦合性,给定一个函数的输入参数,其输出在任何条件下都保持不变。
LISP代码的书写就用一个函数包裹另外一个(堆)函数。
例子:
(defun prompt-for-cd ()
(make-cd
(prompt-read "Title")
(prompt-read "Artist")
(or (parse-integer (prompt-read "Rating") :junk-allowed t) 0)
(y-or-n-p "Ripped [y/n]: ")))
这里的定义了一个函数prompt-for-cd() ,其函数体是另一个函数调用:make-cd,make-cd 的参数又由若干函数组合,像这样一级一级组织起来。
2 使用宏(macro) 生成代码,在语法层次上提高程序的抽象能力。
这里LISP的宏要比C/C++的宏强大的多,有点类似于JAVA的反射,又远超过反射的功能。
例子:
(defmacro backwards (expr) (reverse expr))这个宏把expr中的对象序列反序,但不执行,只返回代码。所以宏的功能在于调用其它函数来生成代码,而不是计算结果。
再由这些生成的代码拼成程序运行。宏生成代码在编译时就已经完成,不占用运行时间,这点和C/C++是一样的。
以上只是初步的心得,强大的宏仍然需要重点学习。