Common Lisp:赋予函数的参数太少,但找不到问题

问题描述

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)))

解决方法

您的代码中有一些错误。

  1. 您使用常量文字。例如。 '(z)的字面值等于(z),并且该符号仍然存在,并且与绑定z 无关。在CL中使用变量的内容创建列表是使用原语cons完成的,并且您拥有list肯定会使用cons创建所有参数的正确列表。例如。 (list z)。如果要使用文字,那么我就无法理解逻辑。例如。 (first '(z))可以简化为'z

  2. 第一个if是无效代码。是。该代码的计算结果为yz,但是由于总是在此之后才对(findandreplace (rest '(z)))进行求值,因此该值将被丢弃。您可能应该确保每个结果都位于尾部位置。例如。 body是一个大的cond表达式。

  3. 递归调用(findandreplace (rest '(z)))仅提供一个参数,而defun具有3个必需参数。这是错误的根源。

  4. 由于变量名含糊不清,因此很难猜测olditemnewitem和要搜索的数据。最好模仿substitute's argument naming