Common Lisp的值类型及SBCL中的底层表示

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

动态类型 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
    评论
    添加红包

    请填写红包祝福语或标题

    红包个数最小为10个

    红包金额最低5元

    当前余额3.43前往充值 >
    需支付:10.00
    成就一亿技术人!
    领取后你会自动成为博主和红包主的粉丝 规则
    hope_wisdom
    发出的红包
    实付
    使用余额支付
    点击重新获取
    扫码支付
    钱包余额 0

    抵扣说明:

    1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
    2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

    余额充值