stackoverflow 上没有 Genera 主题,但我想我应该碰碰运气,世界上(可能)有 5 个使用它的人之一可能在这里;尝试一下并没有什么坏处。
我遇到过这样的情况,我正在使用的一些系统使用漂亮的打印,但 Genera 上没有实现。我已经通过使用漂亮打印的前身 XP 成功解决了我自己系统中的问题。看看xp-code.lisp其中的代码并将其与 CCL 中的代码进行比较,就可以清楚地看出 CCL 漂亮的打印功能从何而来。
一种解决方案(现在被证明是不够的)是使用顶级评估来执行重定义警告(xp::install :package my-package)并从重新定义警告中恢复。问题是,当编译其中一个第三方系统时,它们也会抱怨未实现的漂亮打印功能,因此我必须在每个需要漂亮打印的其他软件包中安装 XP。
真正需要发生的是将 XP 安装在软件包中common-lisp,因为所有这些其他系统都将:use :cl并且期望拥有一个功能齐全的漂亮打印系统。
但这并不那么容易;该CL包已被锁定,每个 XP 符号都需要多次确认并输入“yes”才能将其放入 CL 包中。的文档External-only Packages and Locking表明:
要设置仅供外部使用的包,可以暂时解锁它,然后将所需的符号集驻留在其中
但没有哪里说明如何解锁包裹,而且文档检查器也没有出现太多。
我还必须停下来想一想我是否找错了对象。XP 是根据 Genera 编写的,并且该平台的代码中有条件化。使用该功能安装应该不难install;我想知道我是否遗漏了一些明显的东西。
有谁知道如何解锁该CL软件包,或者在 Genera 中安装 XP 的正确方法吗?随附的 XP 说明似乎已过时。
我正在尝试隐藏 CL 包中的数学运算符。除了*、/和 之外+,这工作正常。然而,这些符号的符号值由实现设置为我在 REPL 中经常使用的值(该函数位于interactive-evalSBCL 中)。
cl:*由于它们是在之前的表单评估中设置的,因此除了通过 CL 包中的符号(即在评估表单之后)之外,我无法获取它们。我考虑制作*一个符号宏,如果在函数上下文中,则可以在我的向量化版本上调度*,或者返回否则的值cl:*。
然而,似乎没有一种简单的方法来确定符号是否被用作函数或值。
到目前为止我得到的一个程式化版本是:
(in-package :my-math-package)
(setf (fdefinition '+) #'my-vectorised-version-of-+)`
Run Code Online (Sandbox Code Playgroud)
由于我的函数版本+是 CL 的超集,因此一切正常,除了*在我的包中尝试在 REPL 中使用之外。我可以使用cl:*并且它可以工作,但我试图保持cl:*和my-package:*值槽同步。
符号值的一种类比可能是:
(setf (symbol-value '+) #'cl:+)
但这不起作用有两个原因:
cl:*没有符号值cl:*即使这样做,它也不会具有上次评估表单的当前值,它将具有当时值的“快照” 。所以我需要动态地保持my-package:*并cl:*具有相同的符号值。
有人有主意吗?我错过了一些明显的东西吗?