List 不使用set更新列表!-计划

List 不使用set更新列表!-计划,list,scheme,List,Scheme,我有一个问题,不使用set在内存中保存列表 我定义了一个初始空列表 (define database (list)) 然后我有一个程序,检查密码是否正确,并将密码对添加到列表中 (define (set-pass l) (if (pair? l) (if (check-pass (second (last l))) (add-to-list l) "password does not meet policy requirements" )

我有一个问题,不使用set在内存中保存列表

我定义了一个初始空列表

(define database (list))
然后我有一个程序,检查密码是否正确,并将密码对添加到列表中

(define (set-pass l)
  (if (pair? l)
    (if (check-pass (second (last l)))
      (add-to-list l) 
      "password does not meet policy requirements"
      )
  "invalid input"
  )
)
以及添加到列表的过程:

(define (add-to-list l)
  ;(append database l)
  ;implement this.
  )
问题是,我必须多次调用此过程:

(set-pass '('john '(X p c F z C b Y h 1 2 3 4 : :)))
(set-pass '('john '(X p c F z C b Y : 1 2 3 4 : :)))
(set-pass '('john '(X p c F z C b : : 1 2 3 4 : :)))

我实现了add-to-list过程,就像调用set-pass一次一样(使用append,如上所示),但是如果我多次调用它,我找不到实现的方法。我试过上面提到的几件事,然后。但我无法实现我想要的。那么我该如何做到这一点呢?

通过将数据库作为变量,可以在功能上做到这一点:

(让循环((输入(读取行))(数据库“())
(显示(格式为“插入~a\n”输入))
(循环(读取行)
(cons输入数据库)
其他功能(移除等)的工作方式与根据操作改变结构时重复出现的方式相同

您还可以使用
set cdr!更新列表。而
设置改变符号指向的内容,
设置cdr
变异一对的
cdr
。因为它需要成对,所以第一个元素必须是一些虚拟数据:

(定义数据库(列出“头”))
(定义(添加元素)
(let((tmp(cdr数据库)))
(设置cdr!数据库(cons元素tmp)))
(定义(删除元素)
(let循环((prev数据库)(cur(cdr数据库)))
(cond((空?cur)#f)
((相等)(车电流)元件)
(设置cdr!上一个(cdr cur)))
(其他(循环电流(cdr电流()())))
(定义(获取)
(cdr数据库)
(加1)
(加2)
(加3)
(获取);=>(3 2 1)
(删除2)
(获取);=>(3 1)

在你允许变异的那一刻,猫就出柜了,所有的变异都是可用的。如果
set,您可以使用闭包创建可变对象,如果
设置car,您可以使用框获得可变绑定/
设置cdr

即使我们将列表封装在过程中,在某些情况下我们也必须使用
set以重新分配它。或者,继续将修改后的列表作为参数传递给需要它的函数。