修复lisp代码中这个未定义的函数



我在评估这段代码以查找错误时失去了理智。我不知道为什么我会得到一个未定义的函数。有人能告诉我为什么吗?谢谢

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

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

如果您在文章中正确复制了代码,那么您就为同一函数使用了两个不同的名称: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. 当条件语句中只有两种情况时,优选使用CCD_;

  4. 对于CCD_ 8的值的检查通常用谓词CCD_;

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

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

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

相关内容

  • 没有找到相关文章

最新更新