自定义函数名称中的冒号导致错误
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"
我是 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"