我对评估此代码以查找错误的想法不知所措。我不确定为什么会得到未定义的函数。有人可以指导我理解原因吗?谢谢!
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程序的通用书写约定的注释:
最好使用小写字母标识符;
[标识符中的复合词用-
分隔,而不是像其他语言一样用_
分隔;
当条件语句中只有两种情况时,最好使用if
;
通常使用谓词nil
来检查null
的值;
表达式结尾处的括号通常写在表达式最后部分的同一行。
所以您的函数可以重写为:
(defun my-attach (o l)
(if (null l)
(list o)
(cons (car l) (my-attach o (cdr l)))))