在Scheme中处理可变数据中的列表

在Scheme中处理可变数据中的列表,scheme,mutable,Scheme,Mutable,我刚刚开始学习易变数据,在使用集合时遇到了一些递归处理列表的问题命令。虽然我的大多数方法在这个函数中都能正常工作,但delete和cardinality函数却不能,我不确定如何在这种类型的函数中解决这个问题 (define (basic-set) (let ((set '())) (define (empty?) (null? set)) (define (insert s) (set! set (cons s set))) (define (

我刚刚开始学习易变数据,在使用
集合时遇到了一些递归处理列表的问题命令。虽然我的大多数方法在这个函数中都能正常工作,但delete和cardinality函数却不能,我不确定如何在这种类型的函数中解决这个问题

(define (basic-set)
  (let ((set '()))
    (define (empty?)
      (null? set))
    (define (insert s)
      (set! set (cons s set)))
    (define (delete s)
      (cond ((equal? (car set) s)(set! set (cons (cdr set)'())))
            (else ((delete s)(cdr set)))))
    (define (element? s)
      (cond ((equal? (car set) s)#t)
            (else ((element? s)(cdr set)))))
    (define (cardinality)
      (cond ((null? set)0)
            (else
            (+ 1 ((cardinality)(cdr set))))))
    (lambda (method)
      (cond ((eq? method 'empty) empty?)
            ((eq? method 'insert) insert)
            ((eq? method 'delete) delete)
            ((eq? method 'element) element?)
            ((eq? method 'cardinality) cardinality)))))

您必须小心实现
delete
元素?
基数
-这些过程必须迭代存储为可变数据的集合,为此,您必须将集合作为参数传递,我会使用命名的
let
来实现

另外,实现
delete
是一件棘手的事情,正确的方法是删除元素,然后在最后更新状态。这就是我的意思:

(define (basic-set)
  (let ((set '()))
    (define (empty?)
      (null? set))
    (define (insert s)
      (set! set (cons s set)))
    (define (delete s)
      (define (helper set)
        (cond ((null? set) '())
              ((equal? (car set) s) (cdr set))
              (else (cons (car set) (helper (cdr set))))))
      (set! set (helper set)))
    (define (element? s)
      (let loop ((set set))
        (cond ((null? set) #f)
              ((equal? (car set) s) #t)
              (else (loop (cdr set))))))
    (define (cardinality)
      (let loop ((set set))
        (cond ((null? set) 0)
              (else (+ 1 (loop (cdr set)))))))
    (lambda (method)
      (cond ((eq? method 'empty) empty?)
            ((eq? method 'insert) insert)
            ((eq? method 'delete) delete)
            ((eq? method 'element) element?)
            ((eq? method 'cardinality) cardinality)))))
例如:

(define s (basic-set))

((s 'insert) 'x)
((s 'insert) 'y)
((s 'element) 'x)
=> #t
((s 'cardinality))
=> 2
((s 'delete) 'x)
((s 'cardinality))
=> 1
((s 'empty))
=> #f

这里的另一种方法是使用匿名函数来匹配外部接口arity和内部方法arity,如下所示。当然比奥斯卡的解决方案更难看,但有时最好在你担心漂亮之前让它发挥作用

(define (basic-set)
  (let ((set '()))
    (define (empty?)
      (null? set))
    (define (insert s)
      (set! set (cons s set)))
    (define (delete s L)
     (set! set 
       (let loop ((L L))
         (cond ((null? L) '())            
               ((equal? (car L) s) (cdr L))
               (else (cons (car L) (loop (cdr L)))))))
    (define (element? s L)
      (cond ((equal? (car L) s) #t)
            (else (element? s  (cdr L)))))
    (define (cardinality L)
      (cond ((null? L) 0)
            (else
             (+ 1 ((cardinality)(cdr L))))))
    (lambda (method)
      (cond ((eq? method 'empty) empty?)
            ((eq? method 'insert) insert)
            ((eq? method 'delete) (lambda (s) (delete s set)))
            ((eq? method 'element) (lambda (s) (element? s set)))
            ((eq? method 'cardinality) (lambda () (cardinality set)))))))