list - 从 Scheme 中的列表中删除元素

标签 list lisp scheme element removeall

这是我第一次发帖,我对方案有疑问。 我必须从列表中删除所有出现的元素,将两者都作为参数传递, 输入这样的参数时:

]=> (rmobject '(1 2 3 5 0 2 3 5 3) 3)

我收到一个错误:

The object (3 5 3 2 3 6 3) is not applicable

我想这是因为第二个 lambda,它不能正常工作,但为什么呢?

(define (rmobject list1 obj)
  (if (null? list1)
      '() 
       (if (= obj (car list1))
           ((lambda (list1) (cdr list1)) list1)
           ((lambda (list1) (list1)) list1)))
        (cons (car list1) (rmobject (cdr list1) obj)))

我重写了代码,这在删除元素时正常工作,但正确的没有,并且两者假设相同。提前致谢

(define (rmobject list1 obj)
  (if (null? list1)
     '() 
  (if (= obj (car list1))
      (rmobject (cdr list1) obj)
      (cons (car list1) (rmobject (cdr list1) obj)))))

最佳答案

您代码中的第一个版本没有多大意义。为什么要以这种方式使用 lambda?您应该递归调用正在定义的相同过程,而不是创建一次性匿名过程,这将无法解决手头的问题。而这部分:(list1) 导致错误 The object is not applicable:您正在尝试调用列表,就好像它是一个过程一样 - 因为它被插入语。请记住,在 Scheme 中,像这样的语法:(foo) 表示要调用 foo 过程

您的代码的第二个版本很好,这是实现remove-all 过程的简单方法。不过,有点挑剔:当您发现自己嵌套了 if 时,这肯定表明 cond 会更合适。另请注意,使用 equal? 代替 = 是个好主意,这样您的过程将不仅仅适用于数字:

(define (rmobject list1 obj)
  (cond ((null? list1)
         '())
        ((equal? obj (car list1))
         (rmobject (cdr list1) obj))
        (else
         (cons (car list1)
               (rmobject (cdr list1) obj)))))

供将来引用:您正在实现的过程通常作为解释器的一部分包含在内。例如,在 Racket 中我们有 remove*,它使用 equal? 作为测试相等性的默认过程:

(define (rmobject list1 obj)
  (remove* (list obj) list1))

此外,您可以像@Maxwell 的回答中那样使用 filter 。另一种写法:

(define (rmobject list1 obj)
  (filter (negate (curry equal? obj)) list1))

无论如何,这有效:

(rmobject '(1 2 3 5 0 2 3 5 3) 3)
=> '(1 2 5 0 2 5)

关于list - 从 Scheme 中的列表中删除元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13550482/

相关文章:

scheme - 控制计划中的评估(贵重)

c - 链接列表反向递归功能不起作用

java - 从列表中过滤对象

lambda - Simply Scheme 第 09 章。Lambda。还有更多的 Lambda 练习吗?

emacs - 使用 elisp 处理文本

tree - 在 lisp 中创建一棵树

python-3.x - 收集特殊键和值并将其放在字典中

ios - NSDictionary获取对象列表中的属性- objective-c

scheme - 有没有关于为 PLT Scheme 编写自定义语言模块的好教程?

c++ - 方案中的 'if ,define, lambda'是什么?