在Common Lisp中输入变量

omr*_*210 1 types typing common-lisp typed

我读到CL支持可选的输入(因为在语言中有这个功能)在很多情况下我会假设allos用于更快的代码,但我似乎找不到任何关于实际编写类型代码的东西.是否可以显式键入代码而不是使用黑客?(例如,#'vector生成一个simple-vector,有点让我想起|0JS强制转换为整数)

或者也许因为类型实际上是CLOS类(它们是,对吧?)你只需要#'make-instance一个类型的对象,比方说,'integer

Rai*_*wig 5

Common Lisp允许定义类型并声明变量,函数,...的类型

类型与类无关 - 类也是类型,但类型可以表达更多(如整数范围,数组大小,数组元素类型,......).

声明类型可能有很多不同的用途:

  • 省略优化代码中的运行时类型检查
  • 在优化代码中生成专门指令
  • 编译时类型检查
  • 优化数据结构的分配
  • 运行时类型检查
  • 文件

因此,使用某些编译器设置(调试,空间,速度,编译速度,安全性......)声明类型的效果并不是很简单.Lisp系统可能会忽略大部分声明或广泛使用它们.效果可能非常不同.在编译器设置的某些组合中,声明类型可能会使代码慢很多,而在其他情况下,它可能会使代码更快.

此外,编译器可能能够进行一些类型的推断.

一个简单的声明可能如下所示:

(defun add-integer (a b)
  (declare (integer a b))
  (the integer (+ a b)))
Run Code Online (Sandbox Code Playgroud)

Lisp系统现在可以执行以下一项或多项操作:

  1. 忽略声明
  2. 添加运行时检查a并且b是整数,并且+运算的结果实际上是整数(而不是浮点数,比率或复数)
  3. 省略+操作的运行时检查
  4. 生成专门的+操作的代码,它只适用于整数
  5. 进行编译时类型检查

实现这一目标的典型编译器设置是:

  1. 安全= 3
  2. 安全= 0
  3. 安全= 0,速度= 3

但确切的设置及其含义可能有所不同,应在Lisp实施手册中记录.

这些类型记录在ANSI Common Lisp Standard中.请参阅类型和类.

有关编译器设置,请参阅:SBCL CompilerLispWorks,The Compiler.

要研究类型声明代码的编译效果,可以使用反汇编时间.