在Lisp代码中修复此未定义功能?

Dru*_*dra 0 lisp syntax recursion common-lisp cons

我迷失了评估这段代码以查找错误的念头。我不确定为什么会得到未定义的函数。有人可以指导我理解原因吗?谢谢!

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

(defun my_attach(O L)
    (cond ((eq L nil )
        O )
        (t (cons (car L) (my-attach O (cdr L)) )
        )
    )
)
Run Code Online (Sandbox Code Playgroud)

Ren*_*nzo 5

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

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

(defun my-attach(O L)
  (cond ((eq L nil ) O)
        (t (cons (car L) (my-attach O (cdr L))))))
Run Code Online (Sandbox Code Playgroud)

但是请注意,这不会产生期望的结果(实际上,它不会产生正确的列表)。相反,您应该在终端用例中使用(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)
Run Code Online (Sandbox Code Playgroud)

最后,关于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)))))
Run Code Online (Sandbox Code Playgroud)