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

Colon in a custom function name causing error

我是 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,但我找不到它的 compiler/interpreter。请帮忙。

冒号用于指定符号包。在您的情况下,这意味着函数 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

有点绕,但是当你研究包时,一切都会变得更加清晰。

我建议您以更 'common-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"

我认为 header:cd 的 UCI Lisp 中的冒号没有任何特定的技术含义。它只是一个标识符,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"