快速加载lisp后未定义的运算符

快速加载lisp后未定义的运算符,lisp,common-lisp,Lisp,Common Lisp,当我运行函数finddatafrom命令时,它运行得很好,而没有首先执行包的“快速加载”。如果我加载包,它会给出一个错误,即拆分序列未定义 我已尝试在加载自定义包后重新加载拆分序列。不起作用 (ql:quickload :<a-custom-package>) (defun find-data-from-command (x desired-command) (setq desired-data ()) (loop for line = (read-line x nil)

当我运行函数finddatafrom命令时,它运行得很好,而没有首先执行包的“快速加载”。如果我加载包,它会给出一个错误,即拆分序列未定义

我已尝试在加载自定义包后重新加载拆分序列。不起作用

(ql:quickload :<a-custom-package>)

(defun find-data-from-command (x desired-command)
  (setq desired-data ())
  (loop for line = (read-line x nil)
    while (and line (not desired-data)) do 
        (progn 
          (setq commands (first (split-sequence ":" line)))
          (setq data (split-sequence "," (first (rest (split-sequence ":" line)))))
          (print (cons "command:" commands))
          (cond
                ((equal commands desired-command) (return-from find-data-from-command data))))))
FIND-DATA-FROM-COMMAND

SIGMA 24 > 
  (setq obj-type (find-data-from-command (open "log.txt") "types"))

Error: Undefined operator SPLIT-SEQUENCE in form (SPLIT-SEQUENCE ":" LINE).
(ql:quickload:)
(从命令中取消查找数据(x所需命令)
(设置所需数据())
(行的循环=(读取行x nil)
而(和行(非所需数据))则
(项目
(setq命令(第一个(拆分顺序):“行”))
(setq数据(分割序列“,”(第一个(其余(分割序列):“行‘‘‘‘)’))
(打印(cons“命令:”命令)
(续)
((与所需命令相等的命令)(从命令数据中查找数据返回‘‘‘‘‘‘‘‘‘)
FIND-DATA-FROM-COMMAND
西格玛24>
(setq obj类型(从命令中查找数据(打开“log.txt”)“类型”))
错误:表单中未定义运算符拆分顺序(拆分顺序):“行”。
解决了这个问题

快速加载自定义包将我带入包中。我没有意识到这一点。所以我必须指定拆分序列是从外部进行的。因此,我将函数定义中所有出现的拆分序列替换为

LISPWORKS:分割序列

然后它成功了

如果有谁有更好的解决方案,请一定告诉我。谢谢

解决了这个问题

快速加载自定义包将我带入包中。我没有意识到这一点。所以我必须指定拆分序列是从外部进行的。因此,我将函数定义中所有出现的拆分序列替换为

LISPWORKS:分割序列

然后它成功了


如果有谁有更好的解决方案,请一定告诉我。谢谢

问题与Quicklisp无关,而是与您在某处定义的名为
SIGMA
的包有关。尤其是代码中的某个地方有一个表单,看起来像:

(defpackage "SIGMA"                     ;or :sigma or :SIGMA or #:sigma or ...
  ...
  (:use ...)
  ...)
后来

(in-package "SIGMA")
问题是包定义有一个显式的
(:use…
子句

,并且底层函数对
有一些有趣的行为:use
子句(或
make package
中的关键字参数):

  • 如果未给出任何值,则存在实现定义的默认值
  • 如果给定一个,则它将覆盖默认值
我认为,这个想法是,实现可能希望提供默认情况下可用的一系列附加功能,而此功能不能在
CL
包中,因为该包的内容在标准中定义。所以如果你说

(defpackage "FOO")
然后允许实现(或者鼓励实现)使
FOO的使用列表中包含一些有用的包。这些软件包可能与
CL-USER
的默认使用列表中的软件包相同,但我不确定是否需要这些软件包:整个软件包的指定有点不够

这样做的最终结果是,如果您想要定义既使用实现定义的功能又具有显式使用列表的包,那么您必须采取一些小技巧。如何做到这一点取决于您自己,但由于您定义编写的是依赖于实现的代码,而您定义的是这样的包,因此您可能希望明确,您所做的是依赖于实现的,具体形式如下

(defpackage :foo
  (:use ...)
  #+LispWorks
  (:use :lispworks :harlequin-common-lisp :cl)
  ...)
或者,如果您只需要一些特定的符号集

(defpackage :foo
  (:use ...)
  #+LispWorks
  (:import-from :lispworks #:split-sequence))
请注意,这与使用包含符号的包不完全相同


在所有这些情况下,如果您的代码自诩是可移植的,那么应该为其他实现提供适当的子句,并且有一种方法可以知道您何时尝试在您尚未看到的实现上运行:我认为如何做到这一点超出了此答案的范围。

问题与Quicklisp无关,这与您在某处定义的名为
SIGMA
的包有关。尤其是代码中的某个地方有一个表单,看起来像:

(defpackage "SIGMA"                     ;or :sigma or :SIGMA or #:sigma or ...
  ...
  (:use ...)
  ...)
后来

(in-package "SIGMA")
问题是包定义有一个显式的
(:use…
子句

,并且底层函数对
有一些有趣的行为:use
子句(或
make package
中的关键字参数):

  • 如果未给出任何值,则存在实现定义的默认值
  • 如果给定一个,则它将覆盖默认值
我认为,这个想法是,实现可能希望提供默认情况下可用的一系列附加功能,而此功能不能在
CL
包中,因为该包的内容在标准中定义。所以如果你说

(defpackage "FOO")
然后允许实现(或者鼓励实现)使
FOO的使用列表中包含一些有用的包。这些软件包可能与
CL-USER
的默认使用列表中的软件包相同,但我不确定是否需要这些软件包:整个软件包的指定有点不够

这样做的最终结果是,如果您想要定义既使用实现定义的功能又具有显式使用列表的包,那么您必须采取一些小技巧。如何做到这一点取决于您自己,但由于您定义编写的是依赖于实现的代码,而您定义的是这样的包,因此您可能希望明确,您所做的是依赖于实现的,具体形式如下

(defpackage :foo
  (:use ...)
  #+LispWorks
  (:use :lispworks :harlequin-common-lisp :cl)
  ...)
或者,如果您只需要一些特定的符号集

(defpackage :foo
  (:use ...)
  #+LispWorks
  (:import-from :lispworks #:split-sequence))
请注意,这与使用包含符号的包不完全相同

在所有这些情况下,如果您的代码自命是可移植的,那么应该为其他实现提供适当的子句,并提供一种知道您何时尝试在现有实现上运行的方法