【问题标题】:CLisp: "use-package" resolving conflicts non-interactivelyCLisp:“使用包”以非交互方式解决冲突
【发布时间】:2010-03-06 23:33:33
【问题描述】:

我正在尝试使用 GNU common 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 导入链,@,(等)”,也可以 - 指定我要手动导入的每个符号。

【问题讨论】:

  • 你能分别显示你的包定义吗? “导入语句”?
  • 对不起,我不明白。你想让我展示什么?

标签: packages common-lisp


【解决方案1】:

不要使用 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:*)

【讨论】:

  • 我把它放在我的文件顶部,叫做“compiler.lisp”,用“my-awesome-program”代替“compiler”:[1]>(加载“compiler.lisp” ) >> RENAME-PACKAGE("SYSTEM"): # 被锁定如果我继续,忽略这个错误,我得到: USE-PACKAGE: 没有名为“COMPILER”的包。 (load "compiler.lisp") 是错误的函数吗?我应该要求它还是其他什么?
  • 阴影导入的东西奏效了,谢谢!我不确定我做了什么让包裹的东西不起作用,我必须在以后的某个时候弄清楚......
  • 我得看看你的文件。仅从您的描述来看,错误消息没有意义。
  • 我认为您使用 clisp 作为您的实现?它带有一个已经定义的名为 COMPILER 的包(它是包 SYSTEM 的昵称)。
  • 如何从包中导入符号列表?我不想为每个符号单独调用它。
猜你喜欢
  • 1970-01-01
  • 2013-05-23
  • 1970-01-01
  • 2014-01-26
  • 1970-01-01
  • 2012-05-05
  • 2014-07-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多