Common Lisp:函数类型说明符中的 * 出现问题

Num*_*bra 2 lisp sbcl common-lisp

几周以来,我意识到我在类型说明符的特定构造方面遇到了麻烦。首先,我使用的是从源代码编译的 SBCL 2.1.9,它“显然通过了所有测试”。

问题是:当我尝试使用这种形式指定函数的类型时

(declaim (ftype (function (*) int) foo))
Run Code Online (Sandbox Code Playgroud)

这是 SBCL 告诉我的

debugger invoked on a SIMPLE-ERROR in thread
#<THREAD "main thread" RUNNING {1001870303}>:
  * is not permitted as an argument to the FUNCTION type specifier
Run Code Online (Sandbox Code Playgroud)

如果不是由于以下几个原因,这很可能是完全正常的:

  • 当在另一台装有 SBCL 2.1.8 的机器上使用完全相同的表单时,此表单完全有效
  • 尽管很难说,但规范似乎并没有禁止这种构造。例如,sb-kernel中有一堆代码,即文件types.lisp(全部写在SB-KERNEL包中),专门用于捕获类型说明符中无效的*符号。如果不详细阅读这些功能,很难判断这是否正常。
  • 许多人比我有更多的经验,在他们的项目中使用这种结构。最近尝试手动编译它们时,这给我带来了很多麻烦,因为 SBCL 不允许我编译这些表格。例如,我就这个问题为 Nyxt 浏览器提出了一个问题,但我在编译游戏引擎 cl-bodge 时仍然遇到困难,该引擎已成功用于制作相当多的游戏(因此,此类错误应该是现在已经过去很久了)

所以,我有几个问题:

  • 一劳永逸地,有问题的形式在 Common Lisp 中是否有效?
  • 如果不是,为什么这么多人,包括一些对 CL 最了解的人,都使用它(看起来没有任何问题)?
  • 如果是(我很确定是),即使在重新编译 SBCL 并通过所有测试之后,我是否会观察到这种行为?
  • 您是否知道如何解决此问题,以便我不再需要(ftype (function (t) bar)在我尝试编译的所有库中手动将这种形式的所有 ftype 声明重写为 foo) ?

提前致谢 !

ign*_*ens 5

(function (*) ...)从来都不是合法的 CL:请参阅hyperspec。SBCL 可能已经接受了它,尽管我不知道它意味着什么(也许与 相同(function (&rest t) ...)?)。如果“一些对 CL 最了解的人”一直在使用,那么,我不会推测他们对 CL 的了解,但我强烈建议他们要么修复他们的声明,要么根据接受它们的实现来条件化它们。