添加 - 更新Scheme中列表中的元素

时间:2013-11-04 03:16:42

标签: list lisp scheme racket

我有一个这种形式的列表'((1'())(2 3)(3 4)(4'()))我想更新它。 例如。其中第一个值int 2放到第二个值5

,结果将是这样的

'((1'())(2 5)'(3 4)(4'()))

我记得这样,但我不知道如何实现它。 我还想将结果插入到我使用的全局列表中

  

(define(update ls var1 var2)

     

(等于?(var1(car(car ls)))(;将元素添加到列表中)(更新(cdr ls))   var1 var2)

2 个答案:

答案 0 :(得分:0)

假设:

  1. 只有一个以2开头的子列表(我们要替换的那个)
  2. 输入是一个子列表列表(不是引用列表,就像我在评论中指出的那样)
  3. ...然后一个简单的解决方案是使用map创建一个包含更新的新列表:

    (define lst '((1 '()) (2 3) (3 4) (4 '())))
    
    (map (lambda (e)
           (if (= (car e) 2) ; check if this is the pair we want to update
               (list 2 5)    ; if so, create a new modified sublist
               e))           ; else keep the sublist as it comes
         lst)
    
    => '((1 '()) (2 5) (3 4) (4 '()))
    

答案 1 :(得分:0)

Oscar答案的一个问题是,如果你想将列表用作全局变量,你必须将它与每个函数调用一起传递,或者使用set!生成一个全新的列表后。

这里可以找到一个简单的表实现。 http://mitpress.mit.edu/sicp/full-text/book/book-Z-H-22.html#%_sec_3.3.3