这段代码的功能是什么?

时间:2011-12-12 05:15:02

标签: lisp common-lisp

任何人都可以帮助我在LISP中使用这个程序:

(defun callie(x y) (if x (callie (cdr x) y))
    (if (= (mod (car x) y) 0) (format t "~a~%" (car x))))

我必须了解功能并进行修复。这个程序做了什么?

3 个答案:

答案 0 :(得分:3)

在尝试理解该程序时,您应该首先修复格式:

(defun callie (x y)
  (if x
      (callie (cdr x) y))
  (if (= (mod (car x) y) 0)
      (format t "~a~%" (car x))))

使用if替换没有else分支的when,以及使用特定zerop谓词与0进行比较,可以进一步澄清:

(defun callie (x y)
  (when x
    (callie (cdr x) y))
  (when (zerop (mod (car x) y))
    (format t "~a~%" (car x))))

预期的参数类型似乎是x的整数列表,y的整数。该函数的目的似乎是打印x的倍数的所有x元素。

问题似乎是函数在x为空之前递归,然后尝试检查该版本x的第一个元素(显然不存在)。因此,要解决此问题,您必须确保该函数不会尝试进一步处理空列表。在我看来,更好的方法是利用标准函数或宏来处理副作用列表,例如mapcdolist

答案 1 :(得分:1)

看起来代码试图从列表X中打印所有可能的值,其中值可以被Y整除。

但它有一些错误。

答案 2 :(得分:1)

在Common Lisp中编写它的通常方法是使用一个返回一个新列表的函数,其中所有项目都不会被给定的数字除以零。

通常,此测试被编写为返回布尔值的谓词函数。然后,此功能用于从列表中删除不需要的项目。

参见REMOVE-IF和REMOVE-IF-NOT。

你的任务是让递归正确。但是在真正的Lisp代码中,递归不是直接使用的。