【问题标题】:Fixing this undefined-function in lisp code? [closed]在 lisp 代码中修复这个未定义的函数? [关闭]
【发布时间】:2019-10-27 22:13:52
【问题描述】:

我在评估此代码以查找错误时失去了理智。我不确定为什么我得到一个未定义的函数。有人可以指导我理解为什么吗?谢谢!

O 应该是一个对象,而 L 应该是一个列表。我正在尝试将 O 附加到列表的末尾并返回列表

(defun my_attach(O L)
    (cond ((eq L nil )
        O )
        (t (cons (car L) (my-attach O (cdr L)) )
        )
    )
)

【问题讨论】:

  • (eq x nil) 通常写成(null x)(not x)。这些是等价的。 null 通常用于nil 表示空列表的情况; notnil 表示布尔值 false 时使用。
  • (cond (x y) (t z)) 形式的两个子句cond,其中xyz 都是单个表达式,通常写作(if x y z)
  • 避免在程序中使用O作为标识符;它可能会被混淆为零。
  • (defun my-attach (oh list) (if (null list) oh (cons (car list) (my-attach oh (cdr list)))))
  • 如果我们测试列表不为空并交换两个子句,我们可以缩短它:(defun my-attach (oh list) (if list (cons (car list) (my-attach oh (cdr list))) oh))

标签: recursion syntax lisp common-lisp cons


【解决方案1】:

如果您在帖子中正确复制了代码,那么您为同一个函数使用了两个不同的名称:my_attach(_ 是下划线字符)和 my-attach(- 是破折号字符)。

只需使用相同的名称。例如:

(defun my-attach(O L)
  (cond ((eq L nil ) O)
        (t (cons (car L) (my-attach O (cdr L))))))

但请注意,这不会产生预期的结果(实际上它不会产生正确的列表)。相反,您应该在终端情况下使用(list O) 而不是O

CL-USER> (defun my-attach(O L)
           (cond ((eq L nil) O)
                 (t (cons (car L) (my-attach O (cdr L))))))
MY-ATTACH
CL-USER> (my-attach 3 '(1 2))
(1 2 . 3)
CL-USER> (my-attach 3 '())
3
CL-USER> (defun my-attach(O L)
           (cond ((eq L nil) (list O))
                 (t (cons (car L) (my-attach O (cdr L))))))
MY-ATTACH
CL-USER> (my-attach 3 '(1 2))
(1 2 3)
CL-USER> (my-attach 3 '())
(3)

最后,关于 Common Lisp 程序的常见书写约定的注释:

  1. 最好使用小写标识符;

  2. 标识符中的复合词由-分隔,而不是像其他语言那样由_分隔;

  3. 当条件语句中只有两种情况时,最好使用if

  4. 检查nil 的值通常使用谓词null

  5. 表达式末尾的括号通常写在表达式最后部分的同一行。

所以你的函数可以重写为:

(defun my-attach (o l)
  (if (null l)
      (list o)
      (cons (car l) (my-attach o (cdr l)))))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-09-03
    • 2012-09-29
    • 1970-01-01
    • 1970-01-01
    • 2021-12-26
    • 2016-08-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多