【问题标题】:Colon in a custom function name causing error自定义函数名称中的冒号导致错误
【发布时间】:2020-05-22 09:23:17
【问题描述】:

我是 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,但我找不到它的编译器/解释器。请帮忙。

【问题讨论】:

  • 这种形式用于命名空间前缀符号。您可以做的是将其重命名为 header/cd of |header:cd|
  • 谢谢!!出于好奇,你知道这个符号在 UCI lisp 中的预期用途是什么吗?
  • 如果它是合法的,如果您可以添加一个指向您尝试修改的程序源的指针可能会很有用。我也找不到任何对“UCI Lisp”本身有意义的东西,尽管有大量的 lisp,所以这可能不足为奇。

标签: lisp common-lisp


【解决方案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"

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 感谢您的解释。我不熟悉这些软件包的工作原理。我认为该解决方案不会起作用,因为“cd”应该是自定义表达式类型而不是函数。该函数应该是“标题”。这就是我认为冒号指定参数类型的原因。抱歉,我的问题并不清楚。在这种情况下我该如何进行?我还没有定义 cd 。谢谢!!
    【解决方案3】:

    我建议您以更“常见的 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"
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-01
      • 2020-06-16
      • 2018-07-09
      • 2019-08-09
      • 2012-09-11
      • 1970-01-01
      相关资源
      最近更新 更多