ftype声明对SBCL中内置函数的影响是什么?

Mar*_*ars 4 sbcl common-lisp declare

我正在构建其他人编写的一些旧的Common Lisp代码,其中包括以下几行中的行:

(declare (ftype (function (&rest float) float) + - * min max))
Run Code Online (Sandbox Code Playgroud)

我的理解是,这样做的目的是告诉编译器表单末尾列出的五个函数只会传递浮点数.编译器可以使用此信息来创建更有效的代码.

有些Lisps不会抱怨此声明(ABCL,CCL,ECL,LispWorks,CLISP),但SBCL不会在默认配置中接受此声明.SBCL可以通过放置来接受它

(unlock-package 'common-lisp)
Run Code Online (Sandbox Code Playgroud)

在.sbclrc初始化文件中.这就是我去年一直在做的事情.我认为这是必需的,因为+, - 等在该包中,并且代码改变了这些函数的声明.

我的问题是:可以声明内置函数的函数类型如+和min对SBCL中的编译代码有什么好处吗?(如果可以,那么为什么SBCL默认会抱怨这些声明?)我最好删除这些ftype声明,然后摆脱unlock-package.sbclrc 中的行吗?

谢谢.

Rai*_*wig 8

我的理解是,这样做的目的是告诉编译器表单末尾列出的五个函数只会传递浮点数.编译器可以使用此信息来创建更有效的代码.

此外,他们只会返回花车.对于某些优化设置,Common Lisp编译器不会生成运行时检查,并且可能只生成浮点计算的代码.此外,SBCL可能会在某些情况下显示编译时警告,它会检测到代码违反了类型声明.

它也是错误的来源,因为从现在开始(在声明的范围内)基本函数+-声明不适用于其他数字类型(整数,复数,...).

那么,这些声明的目的是什么?由于它是可移植代码(并且大多数实现不实现编译时类型检查),因此它只能用于优化目的.其中一些可能在SBCL中不是必需的,因为它使用类型推断.

为什么SBCL默认不允许更改内置功能?这是为了防止你的脚射击:你正在改变基本语言.现在基本的数字操作可能会导致错误.

如何处理:

  • 仅使用本地声明,不要全局更改语言.你表明这些只是在当地宣布 - 这很好.

  • 声明变量的值

  • 为float case编写特殊函数并将它们内联声明.

  • 只在编译这几个函数时解锁包CL.保持锁定以后.

我的问题是:可以声明内置函数的函数类型如+和min对SBCL中的编译代码有什么好处吗?

您可以通过查看反汇编代码和分析来检查.确保使用正确的优化设置编译函数.在Common Lisp中,函数"DISASSEMBLE"应该以可读的方式显示机器代码.SBCL编译器还应该告诉您它是否无法优化已编译的代码.