Lisp - 从对列表中删除实例

Clá*_*iro 0 lisp common-lisp

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

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

(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))))))
Run Code Online (Sandbox Code Playgroud)

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

Error: `(1)' is not of the expected type `NUMBER'
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么?

dry*_*dam 7

您的代码存在问题:

(/ (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)))
Run Code Online (Sandbox Code Playgroud)