Lisp - 从对列表中删除实例

时间:2011-12-02 01:55:11

标签: lisp common-lisp

我想在lisp中创建一个函数,它接收一个数字和一对对的列表,并遍历对列表并删除那对中的第一个元素和第二个元素之间的除法结果。同一对中的数字与作为参数传递的数字不同。最后它返回一个列表,其中只包含除法结果相同的列表。

到目前为止,我有以下代码:

(defun retira-terco(num l1)
(cond ((null l1) ())
    ((not (equal num (/ (car(first l1)) (cdr(first l1)))))
                        (retira-terco num (rest l1)))
    (t (cons (first l1) (retira-terco num (rest l1))))))

当我尝试使用一个真实示例运行此示例时,我收到以下错误:

Error: `(1)' is not of the expected type `NUMBER'

我做错了什么?

1 个答案:

答案 0 :(得分:6)

您的代码存在问题:

(/ (car(first l1)) (cdr(first l1)))

(car (first l1))求值为数字,但(cdr (first l1))求值为列表。你可能意味着(cadr (first l1))

那就是说,这个代码从糟糕的角度来看并不是那么好。您有要过滤的条件。使用更高阶的编程来表达更像这样:

(defun foo (num lst)
   (remove-if (lambda (item) 
                 (equal num 
                        (/ (car item) 
                           (cadr item)))) 
              lst)))