如何让Lisp忘记以前导出的符号?

时间:2012-07-05 19:06:12

标签: lisp common-lisp slime sbcl

这是我从包:bar导出符号:bazfoo的方式:

(in-package :cl-user)
(defpackage foo
   (:use :cl)
   (:export :bar :baz))
(in-package :foo)

当我从导出符号列表中删除:baz时,SBCL会抱怨并且编译失败。

 warning: 
     FOO also exports the following symbols:
       (FOO:BAZ)

如何在不重新加载SLIME的情况下让SBCL忘记:baz

3 个答案:

答案 0 :(得分:10)

<强> SBCL

* (apropos "unexport")

UNEXPORT (fbound)


* (documentation 'unexport 'function)

"Makes SYMBOLS no longer exported from PACKAGE."


* (apropos "unintern")

UNINTERN (fbound)


* (documentation 'unintern 'function)

"Makes SYMBOL no longer present in PACKAGE. If SYMBOL was present then T is
returned, otherwise NIL. If PACKAGE is SYMBOL's home package, then it is made
uninterned."

答案 1 :(得分:2)

有很多关于这些问题的文档,您应该阅读或重读这些文档。这个包/符号的东西乍一看听起来微不足道,但它与其他语言值得一些阅读的不同(即尝试重用其他语言的知识在包和符号方面特别危险)。

如果在阅读完文档后仍然遇到问题,请尝试重新阅读(通过遇到麻烦获得的经验将有助于您专注于相关部分;重读不会在阅读之间遇到麻烦不是很有效率恕我直言)。

我认为有用的一些链接:

答案 2 :(得分:1)

搜索将我引到了这里,但是我遇到了稍微不同的问题。

package br.dev.authentication.view;

import java.io.IOException;

import javax.enterprise.context.RequestScoped;
import javax.faces.context.ExternalContext;
import javax.inject.Inject;
import javax.inject.Named;

@RequestScoped
@Named
public class RedirectorToStart
{
    @Inject
    private ExternalContext _externalContext;

    public void goToStart() throws IOException
    {
        _externalContext.redirect(_externalContext.getRequestContextPath() + "/app/start.xhtml");
    }
}

在这种情况下,一个需要

; caught WARNING:
;   MY-PACKAGE also uses the following packages:
;     (DEPENDENCY)