lisp - Common Lisp:函数类型说明符中 * 的问题
问题描述
几周后,我意识到我在使用与类型说明符有关的特定构造时遇到了麻烦。首先,我使用的是从源代码编译的 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 浏览器打开了一个 issue,但我仍然无法编译已成功用于制作大量游戏的游戏引擎 cl-bodge(因此,此类错误应该是早就过去了)
所以,我有几个问题:
- 一劳永逸,有问题的形式是有效的 Common Lisp 吗?
- 如果不是,为什么这么多人,包括一些最了解 CL 的人,使用它(似乎没有任何问题)?
- 如果是(我很确定是),我是否有任何理由观察到这种行为,即使在重新编译 SBCL 并通过所有测试之后也是如此?
- 您对我如何解决这个问题有任何想法,所以我不再需要
(ftype (function (t) bar)
在我尝试编译的所有库中手动将这种形式的所有 ftype 声明重写为 foo)?
提前致谢 !
解决方案
(function (*) ...)
从来没有合法的 CL:见 hyperspec。SBCL 可能已经接受了它,尽管我不知道它的含义(可能与(function (&rest t) ...)
?)相同。如果“一些最了解 CL 的人”一直在使用,那么,我不会推测他们对 CL 的了解,但我强烈建议他们要么修复他们的声明,要么根据接受它们的实现对它们进行条件化.
推荐阅读
- java - 暂停代码,直到用户在对话框提示上输入数据
- c# - 如果我有管理员政策,请添加其他政策
- python - 功能正常工作,除了通过另一个模块,没有明显的原因
- python - 仅当消息匹配时 Python 才捕获异常
- python - 为什么while一直在这里循环?有人可以解释一下吗?
- javascript - 将画布中上传的图像保存到服务器
- python - 我怎样才能让我的不和谐机器人提到一个人的名字,然后在他们以在聊天中键入变量的形式猜出一个变量后说正确
- javascript - CSS/JavaScript 表行/数据显示和隐藏不适用于我的数据表。?
- javascript - 更改 MongoDB 文档/对象中的所有 MongoDB 对象 ID
- python - 理解变量选择的大型决策树图?