gpt4 book ai didi

types - Common Lisp 类型注释会导致不正常的行为吗?

转载 作者:行者123 更新时间:2023-12-05 09:21:37 25 4
gpt4 key购买 nike

我知道,如果安全设置低,Common Lisp 可以使用类型注释作为优化辅助,并且不会被检查。例如,此程序运行并打印数字和字符串,没有任何类型错误。 (当安全 >= 1 时,我只会在 SBCL 中遇到类型错误)

(declaim (optimize
(speed 3)
(safety 0)))

(defun f (x)
(declare (type fixnum x))
x)

(format t "1 ~A~%" (f 17))
(format t "2 ~A~%" (f "asd"))

我现在想知道如果安全设置为零并且不遵守类型注释,是否有可能创建一个程序来做一些令人讨厌的事情。诸如从一种类型转换为另一种类型(如 C 类型转换)和其他类型的未定义行为。

到目前为止,我还没有找到这样做的例子。我尝试了使用类型化数组的此示例的变体,但没有一个导致类型转换行为。

(declaim (optimize
(speed 3)
(safety 0)
))

(defun f ()
(let ((arr (make-array '(5)
:element-type 'fixnum
:initial-contents (list 1 2 3 4 5))))
(declare (type (vector fixnum 5) arr))
(setf (aref arr 0) "hello")
(aref arr 0)))

(format t "a1 ~A~%" (f))

在 CLISP 中,该程序打印“hello”,而不对 int 进行类型转换,而在 SBCL 中,该程序因 SIMPLE-TYPE-ERROR 错误而中止。

有没有一种方法可以创建一个 Common Lisp 程序,如果我不遵守我的类型声明,它就会让恶魔从我的 Nose 里冒出来?

最佳答案

Common Lisp 标准说有类型声明。它并没有真正说明它们的作用或实现将对它们做什么。

目的:

  • 生成特定类型的代码
  • 运行时和/或编译时类型检查。这主要是由 CMUCL、SBCL 和 SCL 完成的。

假设我们有操作:

(+ i 100)

默认情况下,它是一个通用的 +,它可以处理所有数字类型。

如果我们告诉 i 是一个 fixnum 那么

  • + 操作可以特定于 fixnum

如果另外将返回类型声明为 fixnum:

  • 它可能不会溢出成一个大数

如果我们另外告诉编译器我们想要低安全性,那么编译器将不会生成运行时类型检查。

编译器提供的功能没有标准化。它甚至可以完全忽略类型声明。

如果你有一个支持类型特定代码的编译器(并且有很多这样的编译器),安全性很低并且在运行时提供了错误类型的对象,那么它可能会产生意想不到的后果。包括由于堆内存损坏导致 Lisp 崩溃。

因此,最好只在非常小的代码区域而不是整个文件或系统上使用低安全性。在 locally 中使用声明会有所帮助。

SBCL(还有 SCL 和 CMUCL)很特殊,因为它还将类型声明视为类型检查的断言。

关于types - Common Lisp 类型注释会导致不正常的行为吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31170665/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com