小编CL-*_*SER的帖子

类别:解锁包

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 说明似乎已过时。

common-lisp package

6
推荐指数
1
解决办法
104
查看次数

如何判断调用环境?

我正在尝试隐藏 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:+)

但这不起作用有两个原因:

  1. 编译时cl:*没有符号值
  2. cl:*即使这样做,它也不会具有上次评估表单的当前值,它将具有当时值的“快照” 。

所以我需要动态地保持my-package:*cl:*具有相同的符号值。

有人有主意吗?我错过了一些明显的东西吗?

common-lisp

3
推荐指数
1
解决办法
89
查看次数

标签 统计

common-lisp ×2

package ×1