动态类型 vs. 静态类型
众所周知Common Lisp是一种动态类型语言,
虽然编译器会在编译时检查类型, 但这种检查往往出于编译优化的目的,而不是为了类型安全的严格检查。
至于动态类型,喜欢的人喜欢它,赞扬它可以让代码简洁,开发高效, 厌恶的人厌恶它,批评它不够安全,无法协同工作构建复杂系统。
这也正是是动态类型语言的优美和邪恶的地方。
在Common Lisp里, 你可以通过declare/declaim的type/ftype子句在代码中声明值(对象)类型,也可以通过the来指定值(对象)类型(declare/declaim无非是the的语法糖),
但Common Lisp并不保证如果你在运行时给出一个非该类型的值(对象)会发生什么,行为是undefined。
另外,Common Lisp也不会作型别推倒, 函数的参数的类型无法自动的限定返回值类型。
尽管如此, 一般CL的最佳实践还是建议大家指明所使用的类型, 这样可能会得到更快的运行代码。
值(对象)的类型
很久前收藏的一幅Common Lisp的类型关系图, 看完后你会为它标准库里的类型个数吓倒。
为了让讨论简单起见, 暂时忽略中间CLOS的standard-object相关的部分(CLOS可以视为相对独立的部分),
CL标准中定义的基本类型包括了,
- 字符character, 分为支持基本字符集的base-char(ascii)和扩展字符集的extended-char(unicode)
- 函数function, 如果是编译型的,那就等于compiled-function
- 路径pathname