我试图在 GNU 通用 lisp 中使用 parenscript 将一个 lisp 文件编译成一个 javascript 文件。
我发现如果我尝试使用它的前缀(“ps:@”),则使用 PS 符号宏“@”不起作用。但是,如果我在尝试编译 lisp 文件之前使用 REPL 并运行 (use-package :ps),一切都会按预期工作(并且我不必使用前缀)。
问题是 PS 包包含冲突符号,例如:
*** - (USE-PACKAGE (#<PACKAGE PARENSCRIPT>) #<PACKAGE COMMON-LISP-USER>): 2 name conflicts remain
Which symbol with name "CHAIN" should be accessible in #<PACKAGE COMMON-LISP-USER>?
The following restarts are available:
PARENSCRIPT :R1 #<PACKAGE PARENSCRIPT>
COMMON-LISP-USER :R2 #<PACKAGE COMMON-LISP-USER>
ABORT :R3 Abort main loop
我可以通过选择 :r1 以交互方式解决这个问题,但是当我尝试将这一步放在我的脚本中时,它只是保释(因为它是非交互式的,它不会让我选择使用什么重新启动)
我很想说(在我的脚本中)“只使用所有冲突符号的 PS 版本”,但我不知道该怎么做。
如果我可以说(就像在 python 中那样),“从 PS 导入链,@,(等)” - 指定我想手动导入的每个符号,那也没关系。
最佳答案
不要在 COMMON-LISP-USER 包中工作,而是使用 DEFPACKAGE 制作自己的包:
(defpackage #:my-awesome-program
(:use #:cl #:parenscript))
(in-package #:my-awesome-program)
; your code here
COMMON-LISP-USER 可能包括各种特定于实现的符号。
您还可以使用 SHADOWING-IMPORT 来获取单个符号,覆盖包中当前可能已经可见的内容,例如
(shadowing-import 'ps:*)
关于packages - CLisp : "use-package" resolving conflicts non-interactively,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2394494/