调试简单的LISP功能。

时间:2017-03-30 20:32:19

标签: recursion lisp funcall

我对口齿不清是个新手,我很难弄湿脚。我确信一次,我有一些功能正常工作,我将能够在它们的基础上进行构建并处理更高阶函数和更复杂的问题。

有人可以在以下代码中指出我的错误。

(defun indeHelper(A L N)
 (cond (Null N) nil)
 ((= A (first L) (cons N (indeHelper A (rest L) (+ 1 N)))))
 (t (indeHelper A (rest L) (+ 1 N))))

(defun inde(A L)
  (funcall indeHelper(A L 1)))

我怎么称呼这个?我有一个功能我认为工作正常,但我无法获得调用它的语法。谢谢你的帮助。

1 个答案:

答案 0 :(得分:3)

您有许多语法问题。

COND的语法是:

(cond (test1 body1...)
      (test2 body2...)
      ...)

您的test1应该是(null n),而body1应该是nil,但您并没有将它们包含在括号中。然后你的其他测试和身体在cond之外,从缩进中可以看出。

应该是:

(defun indeHelper(A L N)
  (cond ((Null N) nil)
        ((= A (first L) (cons N (indeHelper A (rest L) (+ 1 N)))))
        (t (indeHelper A (rest L) (+ 1 N)))))

在第二个功能中,您不需要使用funcall。当您调用动态确定的函数时(例如,在编写高阶函数时),您将使用该函数,但您只是调用已知函数。它应该只是:

(defun inde(A L)
  (indeHelper A L 1))

如果您确实需要使用funcall,则语法为:

(funcall someVariable A L 1)

使用funcall时,参数不会被放入嵌套列表中,它们只是funcall的普通参数。