动态类型 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
- 流stream和一大堆具体的功能的流
- 数组array, 一维的vector和多维的simple-array
- 序列sequence, 数组vector和列表list, list又有cons和nil
- 字串string是包含character的vector
- 符号symbol(类似于其他语言标识符的地位)

本文探讨了Common Lisp作为动态类型语言的特点,解释了动态类型在代码简洁性和开发效率上的优势与劣势。接着,详细介绍了Common Lisp的基本类型,如字符、函数、数组、序列等,并指出在CL中声明类型的重要性。最后,深入到SBCL实现,分析了值类型的底层表示,包括low-tag和wide-tag的概念,以及它们如何区分和表示各种类型的值。
最低0.47元/天 解锁文章
1146

被折叠的 条评论
为什么被折叠?



