问题描述
im试图创建一个简单的c lisp程序,该程序查找并替换符号字符串中的符号。我收到一个错误消息,说我给该函数的参数太少了。
(defun findandreplace (x y z)
(if (eq 'x (first '(z))) 'y (first '(z)))
(findandreplace (rest '(z))))
(print (findandreplace 'x 'y '(x y x y z z x z)))
解决方法
您的代码中有一些错误。
-
您使用常量文字。例如。
'(z)
的字面值等于(z)
,并且该符号仍然存在,并且与绑定z
无关。在CL中使用变量的内容创建列表是使用原语cons
完成的,并且您拥有list
肯定会使用cons
创建所有参数的正确列表。例如。(list z)
。如果要使用文字,那么我就无法理解逻辑。例如。(first '(z))
可以简化为'z
-
第一个
if
是无效代码。是。该代码的计算结果为y
或z
,但是由于总是在此之后才对(findandreplace (rest '(z)))
进行求值,因此该值将被丢弃。您可能应该确保每个结果都位于尾部位置。例如。 body是一个大的cond
表达式。 -
递归调用
(findandreplace (rest '(z)))
仅提供一个参数,而defun
具有3个必需参数。这是错误的根源。 -
由于变量名含糊不清,因此很难猜测
olditem
,newitem
和要搜索的数据。最好模仿substitute's argument naming