Lisp 自定义函数名中的冒号导致错误

Lisp 自定义函数名中的冒号导致错误,lisp,common-lisp,Lisp,Common Lisp,我是Lisp新手,目前正在尝试用Common Lisp重做一个旧的UCI Lisp程序。在funcs.lisp中复制以下代码时出现以下问题: ;;; HEADER-CD gets the head act of a CD form. (defun header:cd (x) (car x)) 解释器发出此错误: - READ from #<INPUT BUFFERED FILE-STREAM CHARACTER #P"funcs.lisp" @11>: ther

我是Lisp新手,目前正在尝试用Common Lisp重做一个旧的UCI Lisp程序。在funcs.lisp中复制以下代码时出现以下问题:

;;; HEADER-CD gets the head act of a CD form.
(defun header:cd 
    (x) 
    (car x))
解释器发出此错误:

- READ from #<INPUT BUFFERED FILE-STREAM CHARACTER #P"funcs.lisp" @11>: there is no package
  with name "HEADER"
我不理解代码中冒号的用途,但我猜它是为了指定可接受输入的类型,因为还有另一个函数称为header:pair


我不知道如何解决这个问题。也许我可以转到UCI lisp,但我找不到它的编译器/解释器。请提供帮助。

冒号用于指定符号包。在您的情况下,这意味着函数cd应该在包头中。您应该执行以下操作:

(defpackage header) ; this creates the package header
(in-package :header) ; you move into that package so that it now becomes your working space
(defund cd (x)  ; define the function in header
  (car x) )
(export 'cd) ; this allows the function cd to be called from another package
(in-package :cl) ; now move to another package, i.e. the standard CL package
(header:cd '(1 2 3)) => 1 ; call the function cd from the other package

有点复杂,但当您研究包时,一切都变得更加清晰。

我建议您以更“通用的lisp”方式重新排列数据结构

您可以使用结构,例如:

(defstruct cd header track-list)

CL-USER> (let ((cd (make-cd
                    :header "my cd 1"
                    :track-list (list "track 1" "track 2"))))
           (cd-header cd))
;;=> "my cd 1"

我认为UCI Lisp中header:cd的冒号没有任何特定的技术意义。这只是一个标识符,UCI Lisp中的标识符可能可以->这是一个70年代的Lisp,不再使用,它使用了大多数ASCII字符集,包括冒号:。这里可能是一个编码约定

在Common Lisp中,冒号字符在标识符中具有特殊的技术含义:它将包名与符号名分开。请注意,UCI Lisp没有符号包这样的功能

因此,我只需将UCI Lisp标识符header:cd转换为Common Lisp中的header cd

一种稍微不太有用的方法是将UCI Lisp标识符header:cd转换为Common Lisp中的| header:cd |或header\:cd。竖条脱离符号。反斜杠转义符号中的单个字符

CL-USER 3 > '|HEADER:CD|
HEADER\:CD

CL-USER 4 > (symbol-name '|HEADER:CD|)
"HEADER:CD"

此表单用于名称空间前缀符号。您可以将其重命名为header/cd of | header:cd |谢谢!!出于好奇,你知道这个符号在UCI lisp中的预期用途吗?如果它是合法的,你可以添加一个指向你试图修改的程序源的指针。我也找不到任何对“UCI Lisp”本身有意义的东西,尽管现在和过去都有大量的Lisp,所以这可能并不奇怪。感谢您的解释。我不熟悉这些软件包是如何工作的。我不认为这个解决方案会起作用,因为“cd”应该是一个自定义表达式类型,而不是一个函数。函数应为“header”。这就是为什么我认为冒号指定了参数类型。对不起,我的问题不清楚。在这种情况下,我该如何处理?我还没有定义cd。谢谢