lisp - 通用 Lisp : Trouble with * in function type-specifier

标签 lisp common-lisp sbcl

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

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

(declaim (ftype (function (*) int) foo))

这是 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

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

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

所以,我有几个问题:

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

提前致谢!

最佳答案

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

关于lisp - 通用 Lisp : Trouble with * in function type-specifier,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69711516/

相关文章:

json - 使用 drakma :http-request 发布 JSON 数据

lisp - Common Lisp 中的 Uninterned 符号

copy - 在Lisp中复制哈希表

postgresql - 带有 Postmodern 包的 Common Lisp 中表更改的客户端通知

macros - 这个宏有优势吗?

common-lisp - 如何从 Lisp 镜像中删除函数或变量?

common-lisp - (sb-posix :chdir ) and (load)

lisp - 理解 Common Lisp 中的函数 `tailp`

performance - 如何提高Common Lisp中逐行读取大文件的速度

lisp - 可以接受任何东西作为参数的函数